MySQL 索引的疑问

2019-11-20 23:02:07 +08:00
 littlemoney
菜鸟有个疑问,你执行一条 sql,比如说是根据日期 between and,日期上加了索引,你用 explain 的时候,sql 明明还没执行,可是结果中的 rows 却已经列出了需要扫描的行,这个行,mysql 是怎么推断出的呢?
1237 次点击
所在节点    问与答
8 条回复
msg7086
2019-11-21 01:39:11 +08:00
通过索引?
binux
2019-11-21 01:41:26 +08:00
plan 啊,mysql 需要知道要扫描多少行,才能决定是用索引还是干脆就直接 scan 快。
ra1983
2019-11-21 01:45:04 +08:00
通过 statistics
littlemoney
2019-11-21 09:32:31 +08:00
@binux 可能我表述的不清楚,我的疑问是,mysql 是怎么再执行前就能预判出要扫描多少行的呢?因为我发现,如果你 range 索引的区间选定的很大,超过全表数据 40%的阈值时?(这个可能不准确,不过我试下来的确有这个阈值在),这个时候哪怕你加了索引,它也不会走索引,会全表扫描,我的疑问就在这里,它通过什么手段,在执行前能估计出要扫描的行数呢
richard1122
2019-11-21 09:50:22 +08:00
优化器会在多个执行计划里做出选择,你也可以手动进行 hint。

参考官方文档: https://dev.mysql.com/doc/refman/5.7/en/cost-model.html
richard1122
2019-11-21 09:51:42 +08:00
https://dev.mysql.com/doc/internals/en/optimizer-tracing.html

也可以开启 tracer,可以看到非常具体的执行计划的评估
littlemoney
2019-11-21 10:02:30 +08:00
@richard1122 嗯嗯,好的,谢谢大佬,我瞧瞧
xh520630
2019-11-21 10:20:36 +08:00
会计算使用索引和不使用索引的消耗然后取个小的
有个啥方法通过前多少条有多少命中索引的推测全表有多少条数据符合条件然后计算

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

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

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

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

© 2021 V2EX