mysql对主键查询为啥还是全扫描_禁止MySQL在查询中使用全表扫描

当使用索引找不到结果时,有什么办法可以禁止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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值