Mysql 中查询数据什么情况下不会命中索引?需要怎么优化呢?

本文探讨了MySQL中索引未命中的常见原因,包括索引规范、布尔运算、模糊查询等,并提供了优化策略,如遵循最左前缀原则、避免全表扫描等,帮助提升查询性能和维护效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Mysql 中查询数据什么情况下不会命中索引?需要怎么优化呢?

Mysql小技巧


一、索引是什么?

MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。但实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。建立索引会占用磁盘空间的索引文件。

二、不命中索引的情况:

1.通常不命中索引有这几种情况:

  • 索引规范不合理,sql解析器不命中索引.
  • 表中索引是以表中数据量字段最多的建立的索引,sql解析器不命中索引。(实际就是索引没用,最后全局查找了)
  • bool的字段做索引,sql选择器不命中索引.
  • 模糊查询 %like
  • 索引列参与计算,使用了函数
  • 非最左前缀顺序
  • where对null判断
  • where不等于
  • or操作有至少一个字段没有索引
  • 需要回表的查询结果集过大(超过配置的范围)

三、MySQL 索引优化:

1.通常优化规则:

  • 前导模糊查询不能使用索引。
  • union、in、or 都能够命中索引,建议使用 in。
  • 负向条件查询不能使用索引,可以优化为 in 查询。
  • 联合索引最左前缀原则(又叫最左侧查询)
  • 范围列可以用到索引(联合索引必须是最左前缀)。
  • 计算放到业务层而不是数据库层。
  • 不允许会全表扫描强制类型转换
  • 更新十分频繁、数据区分度不高的字段上不宜建立索引。
  • 如果有 order by、group by 的场景,请注意利用索引的有序性。
  • 利用覆盖索引来进行查询操作,避免回表。
  • 建立索引的列,不允许为 null。
  • 超过三个表最好不要 join。
  • 单表索引建议控制在5个以内。
  • 单索引字段数不允许超过5个。

总结

MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。也是我们工作与学习中需要不断提升自己的方面,这可以让我们追求性能,写出运行最快、占用内存最小、最优质的代码的第一步。

希望这个博客能对你有所益处。我是轻王,我为自己代言。
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫轻王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值