博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

MySQL索引没起作用一个原因

Posted on 2023-02-03 15:40  时间之外  阅读(32)  评论(0编辑  收藏  举报

这两天在优化MySQL数据库,分析慢SQL时发现有一个查询明明已经建了索引,但Explain时并没有用到,网上查的原因都不适用,试验发现和查询结果数量有关。

测试表:tablea,共有10000条记录

索引字段:userid,int类型

userid不同值的记录数量:

userid 数量
1 25
2 9975

userid取不同值时情况不一样

EXPLAIN SELECT * FROM tablea WHERE userid=1
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE tablea (NULL) ref userid userid 4 const 20 100.00 (NULL)

 

EXPLAIN SELECT * FROM tablea WHERE userid=2
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE tablea (NULL) ALL userid (NULL) (NULL) (NULL) 10161 98.17 Using where
查询结果数量很大时使用索引的开销不如不用,此时就不会使用索引,经测试userid=1有9500条时开始不启用索引,也就是筛选的结果在全表的95%左右时索引会失效,多次试验发现这个95%不固定,有个浮动的范围,不清楚MySQL的这一机制的原理。