我有约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秒以内。
答案 0 :(得分:2)
请提供
SHOW CREATE TABLE
SHOW VARIABLES LIKE '%buffer%';
可能原因:
key_buffer_size
(使用MyISAM时)不是RAM的20%;或innodb_buffer_pool_size
不是可用RAM的70%(使用InnoDB时)。PRIMARY KEY
。 (拥有它真的很重要。)对于3000行需要15秒的加载时间,我推断出:
答案 1 :(得分:1)
给定服务器的规格,在索引表上花费大约13秒是正常的吗?
响应时间的高方差表明有问题。只有8 GB的RAM和1500万行,您可能没有足够的RAM将索引保留在内存中。
是否在服务器上启用了交换功能?这可以解释响应时间的急剧增加。
使用top
,htop
或glances
之类的工具调查内存状况。