当前位置: 首页 > news >正文

MySQL多列索引查询优化

1. 单列索引的使用逻辑

如果 abc 是三个独立的单列索引:

  • 优化器通常只会选择其中一个索引(通常是选择性最高的索引)进行扫描,然后通过回表(回主键索引)获取完整数据行,再应用剩余条件(bc)进行过滤。
  • 示例:假设 a 的选择性最高(即不同值更多),优化器可能选择 a 的索引,找到所有满足 a 条件的行,再逐行检查 bc 是否符合条件。
  • 执行计划:通过 EXPLAIN 查看时,key 列会显示实际使用的索引(如 a),Extra 列可能显示 Using where,表示回表后需过滤其他条件。

2. 索引合并(Index Merge)

在特定情况下,MySQL 可能使用 Index Merge Optimization,即同时使用多个索引的交集(AND 条件)或并集(OR 条件):

  • 触发条件:需要满足 WHERE 中的多个条件可以分别通过不同索引高效过滤。
  • 示例:若优化器认为同时使用 ab 的索引更高效,可能通过 index_merge_intersection 合并结果,再过滤 c
  • 执行计划type 列显示 index_mergekey 列显示多个索引(如 a,b),Extra 列显示 Using intersect(a,b); Using where

3. 联合索引(最推荐的方式)

如果经常需要同时查询 abc最佳实践是创建联合索引

CREATE INDEX idx_a_b_c ON table_name(a, b, c);
  • 执行逻辑:通过联合索引直接按最左前缀(a → b → c)快速定位数据,无需回表(如果查询仅需索引覆盖的列)。
  • 优势:效率远高于单列索引或索引合并,因为索引本身已包含所有条件字段,且顺序符合最左前缀原则。

验证方法:使用 EXPLAIN

通过 EXPLAIN 查看实际执行计划:

EXPLAIN SELECT * FROM table_name WHERE a = 1 AND b = 2 AND c = 3;
  • 关键字段解读
    • type:访问类型(如 refindex_merge)。
    • key:实际使用的索引。
    • Extra:额外信息(如 Using where 表示回表后过滤)。

总结

  • 单列索引场景:通常只用一个索引,其他条件回表过滤。
  • 索引合并场景:可能用多个索引,但需满足优化器策略。
  • 最佳实践:优先使用联合索引 (a, b, c),效率最高。

建议根据实际查询模式设计联合索引,并通过 EXPLAIN 验证优化器的选择。

http://www.dtcms.com/a/29306.html

相关文章:

  • express+Vue2进行项目实战-景点后台管理系统(上篇)
  • SpringCloud-Eureka初步使用
  • uniapp实现app的pdf预览
  • 手机控制电脑远程关机
  • SOC- armv8 启动流程和安全启动
  • 虚拟表格实现全解析
  • 机器学习数学基础:29.t检验
  • 【新人系列】Python 入门(三十一):内存管理
  • Java中JDK、JRE,JVM之间的关系
  • 2025开源数据工程全景图
  • 【Java进阶学习 第一篇】Java中的继承
  • Ubuntu搭建RTSP服务器
  • DeepSeek学术指南:利用DeepSeek撰写学术论文和需要注意的问题
  • Git 中 rebase, squash, amend 的作⽤
  • 服务器配置-从0到分析2:服务器基本设置
  • 第4章 信息系统架构(四)
  • Git企业开发
  • 机器学习笔记——常用损失函数
  • python 神经网络教程,神经网络模型代码python,小白入门基础教程
  • 云端SaaS系统架构设计
  • Web入侵实战分析-常见web攻击类应急处置实验2
  • 【随手笔记】NB和4G信号杂记
  • golang--字符串处理(rune类型)
  • Qt开源项目获取
  • 【GORM学习笔记】GORM介绍以及增删改查相关操作
  • 算法的解题模式Ⅳ
  • Jenkins 配置 Credentials 凭证
  • vue自定义指令clickOutside篇、元素外部点击事件
  • 拼多多面试题记录
  • JavaScript 中 多个 Promise 嵌套中,如何保证正确的执行顺序?