mysql in 什么情况下会全表扫描?

2019-09-26 16:14:42 +08:00
 jojojo

我有一个表 a,里面有 6 条数据,id 是主键,当我用

id in (1,2,3)

这时候查看 explain 发现 type 是 range,key 是 primary。当我用

id in (1,2,3,4)

这时候 type 是 all

想问一下,为什么会发生这样的情况

6450 次点击
所在节点    MySQL
6 条回复
linjiayu
2019-09-26 16:20:59 +08:00
数据量超过百分之几,应该是 33%,不过看样子不是
arrow8899
2019-09-26 17:20:48 +08:00
你要把整个 sql 发出来,计算查询成本涉及到很多因素;
你可以用 `EXPLAIN FORMAT=JSON 你的 sql 语句` 查看更详细的信息,主要关注 cost 字段
InternetExplorer
2019-09-26 17:24:08 +08:00
数据很少的时候 mysql 会自己选择扫表还是用索引
Dogergo
2019-09-26 17:57:04 +08:00
mysql 觉得全表扫描的代价更低。
optional
2019-09-26 18:06:32 +08:00
虽然没看过源码,但是可以猜测下,mysql 会判断如果走索引会扫描几个 page,
如果 page < n 就会走索引
Aresxue
2019-09-29 09:43:05 +08:00
eq_range_index_dive_limit

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/604458

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX