gpt4 book ai didi

Mysql 在 600 万行表上的性能

转载 作者:IT老高 更新时间:2023-10-28 23:59:00 25 4
gpt4 key购买 nike

有一天我怀疑我必须学习 hadoop 并将所有这些数据传输到非结构化数据库,但我很惊讶地发现在这么短的时间内性能下降如此显着。

我有一个不到 600 万行的 mysql 表。我正在对该表执行一个非常简单的查询,并且相信我已准备好所有正确的索引。

查询是

SELECT date, time FROM events WHERE venid='47975' AND date>='2009-07-11' ORDER BY date

解释返回

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra1   SIMPLE  updateshows     range   date_idx    date_idx    7   NULL    648997  Using where

据我所知,我使用的是正确的索引,但此查询需要 11 秒才能运行。

数据库是 MyISAM,phpMyAdmin 说表是 1.0GiB。

这里有什么想法吗?

编辑:date_idx 是 date 和 venid 列的索引。这些应该是两个单独的索引吗?

最佳答案

您要确保的是查询将仅使用索引,因此请确保索引涵盖您选择的所有字段。此外,由于它涉及范围查询,因此您需要在索引中首先拥有 venid,因为它是作为常量查询的。因此,我会像这样创建和索引:

ALTER TABLE events ADD INDEX indexNameHere (venid, date, time);

有了这个索引,完成查询所需的所有信息都在索引中。这意味着,希望存储引擎能够获取信息,而无需实际在表本身内部进行搜索。然而,MyISAM 可能无法做到这一点,因为它没有将数据存储在索引的叶节点中,因此您可能无法获得所需的速度提升。如果是这种情况,请尝试创建表的副本,并在副本上使用 InnoDB 引擎。在那里重复相同的步骤,看看速度是否有显着提高。 InnoDB 确实将字段值存储在索引叶中,并允许覆盖索引。

现在,希望您在解释查询时会看到以下内容:

mysql> EXPLAIN SELECT date, time FROM events WHERE venid='47975' AND date>='2009-07-11' ORDER BY date;

id select_type table type possible_keys key [..] Extra
1 SIMPLE events range date_idx, indexNameHere indexNameHere Using index, Using where

关于Mysql 在 600 万行表上的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1114619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com