当使用索引找不到结果时,有什么办法可以禁止MySQL执行全表扫描?禁止MySQL在查询中使用全表扫描
例如下面的查询:
SELECT *
FROM a
WHERE (X BETWEEN a.B AND a.C)
ORDER BY a.B DESC
LIMIT 1;
仅仅是有效的,如果X满足该条件,至少有1返回行,但如果条件不能由表中的任何数据来满足,全盘扫描会被执行,这可能是非常昂贵的。
我不想优化这个特定的查询,它只是一个例子。
EXPLAIN此查询与X或外部的范围:
id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE a range long_ip long_ip 8 \N 116183 100.00 Using where
状态变量显示出更好的信息。对于范围之外的X:
Handler_read_prev 84181
Key_read_requests 11047
在范围:
Handler_read_key 1
Key_read_requests 12
如果只是有办法阻止Handler_read_prev从日益增长过去1
更新。我不能接受我自己的答案,因为它没有真正回答这个问题(尽管如此,HANDLER是一个很棒的功能)。在我看来,没有通用的方法来防止MySQL进行全面扫描。虽然像key ='X'这样简单的条件将被视为“不可能的地方”,但像BETWEEN这样的更复杂的东西不会。
+0
我假设你有一对索引(B,C),而不是每个单独的列,对不对?也许索引统计是错误的,你是否试图在桌面上运行'ANALYZE'? –
2009-10-24 17:20:10
+0
是的,但是你的意思是“索引统计是错误的”?我没有试图优化这个查询,我只是问是否有办法禁止MySQL执行全表扫描。 –
2009-10-24 18:19:05
+0
查询优化器依赖于数据统计信息。它根据统计数据确定成本并选择最佳方式。如果统计数据不存在,成本估算就会出错,它不会使用最好的方式获取数据。我只是说这只是因为在新创建索引的大表上,即使查询没有返回结果,它也会使用索引。 –
2009-10-24 18:26:04