小插曲:同事说,建立了索引的时间戳字段,竟然不走索引,而且经过各种尝试,发现某些情况下有效,有些情况下无效!太神奇,为什么索引还能这样?
结论
因为MySQL优化器认为检索条件不及全表扫描更高效,所以他会选择全表扫描
应对方法:
- 推荐:优化字段,保证索引字段重复率低,最好是唯一索引
- 增加FORCE INDEX (create_time)
- 执行分析表SQL(ANALYZE TABLE),更新索引状态
- 调整系统优化敏感参数:max_seeks_for_key
原理分析:
由于MySQL具有索引优化分析能力,不同情况下,索引可能生效,也可能不生效,具体原因如下(参考):
- 表太小,执行全表扫描更快,比如10