mysql 索引问题?

2020-03-13 17:24:46 +08:00
 leorealman

如图,为什么 Expain 执行计划没走索引嗯?

MYSQL VEISION: 5.7.21-21-log Percona Server (GPL), Release 21, Revision 2a37e4e

3014 次点击
所在节点    MySQL
14 条回复
hbolive
2020-03-13 17:35:29 +08:00
可能 mysql 认为,就这几条数据,还是全表扫描来得快?
b821025551b
2020-03-13 17:36:14 +08:00
你这数据量太少了,怼进去几十万条数据再说。
falsemask
2020-03-13 17:38:53 +08:00
1L+1,有可能,走索引查还需要回表查所有字段,mysql 选择了全表扫描,你试试 select name, age
leorealman
2020-03-13 17:42:31 +08:00
@hbolive 还有这个说法嘛?大佬
brader
2020-03-13 17:44:41 +08:00
mysql 的查询优化器,会预估多种查询方式的成本,来生成最佳的查询计划,如果某个字段的辨识度不高,那么 mysql 优化器进行采样预估的时候,可能会认为使用索引的成本较高(采样失误可能原因:基数太小、采样小概率采集到一样的)转而进行全表扫描
gz911122
2020-03-13 17:49:29 +08:00
stabc
2020-03-13 18:00:24 +08:00
先执行
·SELECT SQL_NO_CACHE * FROM TABLE·
zzmx
2020-03-13 18:01:21 +08:00
mysql trace 了解一下。5 楼说的比较详细,应该就是这样了
huigeer
2020-03-13 18:09:13 +08:00
name 和 age 的联合索引走一波试试
lis66951735
2020-03-13 18:10:25 +08:00
涨知识了
ylsc633
2020-03-13 18:20:39 +08:00
优化器觉得 你这数据这么少 扫全表都比 索引来的快! 就不走索引了!

相反! 比如你查询的数据是个范围!数量比较多,开始时候 可能走索引,范围越来越大,那么 很可能也就不走索引了!
enorth
2020-03-13 19:17:33 +08:00
个人觉得是 select * 的缘故,用 覆盖索引 select name,age 就会走索引了
enorth
2020-03-13 19:51:39 +08:00
试了下,自己错了。应该是 5 楼的原因。
encro
2020-03-14 19:56:26 +08:00
大于总数一半,不走索引。

如一个表里面有 status 这个字段,status=1 绝大部分,status=0 少部分,那么 where status=1 不走,status=0 走索引

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

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

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

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

© 2021 V2EX