创建几分钟后一个指标,但慢后快的查询的MySQL

时间:2019-02-03 02:14:36

标签: mysql sql indexing

我有约15万行数的表。当我在id列上创建一个idex,然后执行一个简单的查询,如SELECT * FROM my_table WHERE id = 1时,我在一秒钟内检索了数据。但是,几分钟后,如果我使用其他ID执行查询,则将花费15秒以上的时间。

我确定这不是查询缓存,因为我一直在尝试使用不同的ID,以确保不会从缓存中检索到。另外,我使用EXPLAIN来确保它正在使用的索引。

服务器的规格为:

CPU: Intel Dual Xeon 5405 Harpertown 2.0Ghz Quad Core
RAM: 8GB
Hard drive 2: 146GB SAS (15k rpm)

我注意到另一件事是,如果我执行REPAIR TABLE my_table的一个内成为查询第二试。我假设正在缓存某些内容,无论是表还是索引。如果是这样,有什么方法可以告诉MySQL保持缓存。根据服务器的规格,在索引表上花费大约13秒是否正常?索引不是唯一的,每个查询返回大约3000行。

注意:我正在使用MyISAM,我知道这些表中不会有任何写操作,所有查询都将是读取数据。

已解决:感谢您的回答,正如许多人指出的是key_buffer_size。我还使用与索引相同的列对表进行了重新排序,因此记录不会分散,现在我正在执行查询持续在1秒以内。

2 个答案:

答案 0 :(得分:2)

请提供

SHOW CREATE TABLE
SHOW VARIABLES LIKE '%buffer%';

可能原因:

  • key_buffer_size(使用MyISAM时)不是RAM的20%;或innodb_buffer_pool_size不是可用RAM的70%(使用InnoDB时)。
  • 另一个查询(或查询组)即将传入并“清空缓存”(key_buffer或buffer_pool)。寻找此类查询。
  • 使用InnoDB时,您没有PRIMARY KEY。 (拥有它真的很重要。)

对于3000行需要15秒的加载时间,我推断出:

  • 表的缓存(不一定是索引的缓存)已耗尽,并且
  • 这3000行分散在桌子周围(因此,获取一行对查找后续行没有太大帮助)。

内存分配博客:http://mysql.rjweb.org/doc.php/memory

答案 1 :(得分:1)

  

给定服务器的规格,在索引表上花费大约13秒是正常的吗?

响应时间的高方差表明有问题。只有8 GB的RAM和1500万行,您可能没有足够的RAM将索引保留在内存中。

是否在服务器上启用了交换功能?这可以解释响应时间的急剧增加。

使用tophtopglances之类的工具调查内存状况。