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