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

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.kler.cn/a/555634.html

相关文章:

  • JavaScript基础之深拷贝浅拷贝
  • Python 高级特性-切片
  • 网络安全知识:网络安全概念、内容和主要技术纵览
  • Hive JSON解析终极武器:魔改`json_tuple`源码支持嵌套路径完整指南
  • 七星棋牌源码高阶技术指南:6端互通、200+子游戏玩法深度剖析与企业级搭建实战(完全开源)
  • 【Server Components 解析:Next.js 的未来组件模型】
  • 最新本地部署 DeepSeekR1 蒸馏\满血量化版 + WebOpenUI 完整教程(Ubuntu\Linux系统\Ollama)
  • 【WPS+VBA】表格中重复表头与页码的批量删除
  • C/C++ 指针避坑20条
  • KT142C语音芯片支持的语音文件格式什么?Mp3还是wav呢?
  • 【Unity 游戏引擎插件】Modular Multiplayer FPS Engine (Mirror) (MMFPSE) 专注于帮助开发者快速构建多人第一人称射击(FPS)游戏
  • AI助力下的PPT革命:DeepSeek 与Kimi的高效创作实践
  • SQLMesh 系列教程7- 详解 seed 模型
  • 发现一个挺好的项目,可以在springboot项目中快速接入DeepSeek API,有需要的可以尝试一下
  • 技术总结 | MySQL面试知识点
  • 数据库系统概念
  • 自然语言处理NLP 01语言转换语言模型
  • 如何优化 Webpack 的构建速度?
  • 设计模式教程:命令模式(Command Pattern)
  • 使用vue-office报错TypeError: ft.createElementVNode is not a function