
如图,为什么 Expain 执行计划没走索引嗯?
MYSQL VEISION: 5.7.21-21-log Percona Server (GPL), Release 21, Revision 2a37e4e
1
hbolive 2020 年 3 月 13 日
可能 mysql 认为,就这几条数据,还是全表扫描来得快?
|
2
b821025551b 2020 年 3 月 13 日
你这数据量太少了,怼进去几十万条数据再说。
|
3
falsemask 2020 年 3 月 13 日
1L+1,有可能,走索引查还需要回表查所有字段,mysql 选择了全表扫描,你试试 select name, age
|
4
leorealman OP @hbolive 还有这个说法嘛?大佬
|
5
brader 2020 年 3 月 13 日
mysql 的查询优化器,会预估多种查询方式的成本,来生成最佳的查询计划,如果某个字段的辨识度不高,那么 mysql 优化器进行采样预估的时候,可能会认为使用索引的成本较高(采样失误可能原因:基数太小、采样小概率采集到一样的)转而进行全表扫描
|
6
gz911122 2020 年 3 月 13 日
@leorealman 有
|
7
stabc 2020 年 3 月 13 日
先执行
·SELECT SQL_NO_CACHE * FROM TABLE· |
8
zzmx 2020 年 3 月 13 日
mysql trace 了解一下。5 楼说的比较详细,应该就是这样了
|
9
huigeer 2020 年 3 月 13 日
name 和 age 的联合索引走一波试试
|
10
lis66951735 2020 年 3 月 13 日
涨知识了
|
11
ylsc633 2020 年 3 月 13 日
优化器觉得 你这数据这么少 扫全表都比 索引来的快! 就不走索引了!
相反! 比如你查询的数据是个范围!数量比较多,开始时候 可能走索引,范围越来越大,那么 很可能也就不走索引了! |
12
enorth 2020 年 3 月 13 日
个人觉得是 select * 的缘故,用 覆盖索引 select name,age 就会走索引了
|
13
enorth 2020 年 3 月 13 日
试了下,自己错了。应该是 5 楼的原因。
|
14
encro 2020 年 3 月 14 日
大于总数一半,不走索引。
如一个表里面有 status 这个字段,status=1 绝大部分,status=0 少部分,那么 where status=1 不走,status=0 走索引 |