我有一个表,这是大约200万行(115 MB),它是关于要大得多。当在桌面上运行一些实用程序脚本时,我发现我的一个查询需要很长时间(15+秒),而几乎相同的查询在之前不到半秒。下面是查询:
查询1:
SELECT `id` FROM `my_table` WHERE `my_column`='test' ORDER BY `id` LIMIT 28000, 1000
Execution time: 0.204 seconds
查询2:
SELECT `id` FROM `my_table` WHERE `my_column`='test' ORDER BY `id` LIMIT 29000, 1000
Execution time: 10.203 seconds
索引和表信息
id
是一个主键,my_column
也索引(虽然目前它的基数我只有S1)
• ID是一个int
• my_column是一个varchar(50)
查询解释
查询1:类型:索引,possible_keys :my_column,key:PRIMARY,key_len:4,行:29000,额外:使用其中
问题2:类型:范围,possible_keys:my_column,键:my_column,key_len:行 :2,139,123 额外:使用where;使用filesort
正如你可以看到第二个查询使用my_column
键和文件并永久使用,但我所做的只是将极限偏移量增加1,000。
如何暂时解决了这一问题
1)如果我删除WHERE my_column = 'test'
条件MySQL优化正确使用主键进行排序,但我不能删除这个条件,因为很快会有其他在my_column
中我需要为这个查询过滤掉这些值。 2)如果我使用FORCE INDEX (PRIMARY)
,mysql优化器也会使用正确的索引,但这似乎是一种破解。
我的问题
究竟为什么mysql的选择使用my_column
指数,而不是主键的?有没有更好的方法来处理这个在表定义,索引或我的查询结构?
叹息......我只是喜欢愚蠢的疏忽。感谢您的帮助 – Jeff 2012-02-08 21:53:46