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

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

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

希望这个博客能对你有所益处。我是轻王,我为自己代言。
### 三级标题:MySQL索引数据结构与查询原理 MySQL中最常见的索引结构是**B+(B+ Tree)**,它是一种自平衡的结构,能够支持高效的查找、插入和删除操作。B+索引数据按顺序组织,使得范围查询和等值查询都能高效执行。在B+中,所有的数据记录都存储在叶子节点中,而非叶子节点仅存储索引信息,从而减少了磁盘 I/O 操作次数,提高了查询效率[^1]。 在查询过程中,MySQL会根据查询条件自动选择合适的索引,例如通过 `EXPLAIN` 语句可以查看查询是否使用了索引。关键字 `Using index` 表示查询可以直接从索引中获取数据,而无需访问实际的数据行,这种优化方式可以显著提升查询性能[^3]。 索引查询原理依赖于其结构特性:B+的查找过程是从根节点开始,逐层向下查找,直到找到对应的叶子节点。每个叶子节点包含一个指向实际数据行的指针,从而实现快速定位数据记录。此外,B+支持范围扫描,使得像 `WHERE id > 100` 这样的查询也能高效执行[^1]。 ### 三级标题:SQL语句与索引优化方法 在项目开发中,优化SQL语句和索引是提升数据库性能的关键环节。以下是一些常见的优化策略: 1. **合理使用索引** 在频繁查询的列上建立索引,例如主键、外键或经常出现在 `WHERE` 条件中的字段。避免在低基数列(如性别字段)上创建索引,因为其选择性差,索引效果有限。可以使用 `USE INDEX` 提示MySQL使用特定索引,但最终是否采用仍由优化器决定[^2]。 2. **避免全表扫描** 查询语句应尽量避免使用 `SELECT *`,而是只查询需要的字段,并确保这些字段包含在索引中。这样可以利用覆盖索引(Covering Index),使得查询完全命中索引而无需回表[^3]。 3. **优化JOIN操作** 在进行多表连接时,确保连接字段上有索引,并尽量减少连接表的数量。对于大表连接,可以考虑使用临时表或分批次处理。 4. **避免排序和临时表** 如果查询中包含 `ORDER BY` 或 `GROUP BY`,尽量使用索引字段进行排序和分组,以避免 `Using filesort` 和 `Using temporary` 的出现,这些操作会显著降低查询效率[^3]。 5. **定期分析和优化表** 使用 `ANALYZE TABLE` 和 `OPTIMIZE TABLE` 命令维护索引统计信息和数据碎片,确保查询优化器能做出最优的执行计划。 6. **使用EXPLAIN分析执行计划** 通过 `EXPLAIN` 语句查看 SQL 查询的执行计划,判断是否使用了正确的索引、是否存在全表扫描、是否使用了临时表等,从而进行针对性优化。 ```sql EXPLAIN SELECT * FROM tb_user USE INDEX (idx_user_pro) WHERE profession = '软件工程'; ``` 该语句可以查看查询是否使用了建议的索引,并结合 `Extra` 字段判断是否命中了覆盖索引、是否进行了文件排序等关键信息[^2]。 --- ###
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

猫轻王

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

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

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

打赏作者

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

抵扣说明:

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

余额充值