

如图,为什么 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 走索引 |