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

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

Mysql小技巧

文章目录

  • Mysql 中查询数据什么情况下不会命中索引?需要怎么优化呢?
  • 一、索引是什么?
  • 二、不命中索引的情况:
    • 1.通常不命中索引有这几种情况:
  • 三、MySQL 索引优化:
    • 1.通常优化规则:
  • 总结


一、索引是什么?

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的检索速度。也是我们工作与学习中需要不断提升自己的方面,这可以让我们追求性能,写出运行最快、占用内存最小、最优质的代码的第一步。

希望这个博客能对你有所益处。我是轻王,我为自己代言。

你可能感兴趣的:(Mysql,mysql,数据库,b树,索引,mysql优化)