说说复合索引之最左前缀原理?

分析&回答

MySQL中的索引可以以一定顺序引用多个列,这种索引叫做复合(联合)索引。

如果表 Ta 中存在索引 A、B、(C、D)

规则1:全列匹配

复制代码
SELECT * FROM Ta  WHERE E = 'F1' AND A ='10001';
复制代码

若没有按照索引顺序时,mysql查询优化器会自动的调整顺序来使用定义好的索引,如果我们将where中的条件顺序颠倒效果是一样的。

规则2:最左前缀匹配

复制代码
SELECT * FROM Ta  WHERE  A ='10001' AND B = 'B001' ;
复制代码

当查询条件精确匹配索引的左边连续一个或几个列时,只用到了索引的第一列前缀

规则3:查询条件没有指定索引第一列

复制代码
SELECT * FROM Ta  WHERE  D = 'D001' ;
复制代码

由于不是最左前缀,索引这样的查询显然用不到索引。

规则4:匹配某列的前缀字符串。

复制代码
SELECT * FROM Ta  WHERE  C LINK 'C001%' ;
复制代码

此时可以用到索引,如果通配符%不出现在开头,则可以用到索引。

规则5:范围查询(范围查询后面的列将无法使用索引)

对于范围条件查询,MYSQL无法再使用范围后面的其他索引列了。但对多个等值条件查询则没有这样的限制。

规则6:查询条件中含有函数或表达式

如果查询条件中含有函数或表达式,则MySQL不会为这列使用索引(虽然某些在数学意义上可以使用)。

反思&扩展

如何创建合理的索引,索引如何优化?

喵呜面试助手:一站式解决面试问题,你可以搜索微信小程序 喵呜面试助手 或关注 喵呜刷题 -> 面试助手 免费刷题。如有好的面试知识或技巧期待您的共享!

相关推荐
JAVA面经实录91711 分钟前
Hibernate面试题库
数据库·oracle·hibernate
2301_7736436226 分钟前
华为云存储实验
网络·mysql·华为云
迷枫71237 分钟前
DM8 目录结构与常用排查入口梳理
服务器·数据库
Mr.Daozhi2 小时前
RAG 进阶实战:跑通 Demo 后我连续翻了 6 次车,逐一修复才真正可用(含 Gradio Web 版)
前端·数据库·langchain·大模型·gradio·rag·科研工具
小程故事多_802 小时前
Claude Code自定义workflow skills用法
数据库·人工智能·智能体
大鹏说大话2 小时前
SQL 排序与分组实战:解决“分组后取最新数据“
android·java·数据库
quan26312 小时前
20260529,日常开发-数据库主从问题
java·mysql·主从·延迟
夏贰四2 小时前
数据建模工具如何筑牢数据根基?数据建模工具怎样落实标准体系?
数据库·数学建模·数据建模工具
程序猿阿伟4 小时前
《一套完整方法论:搞定图形应用的Docker镜像优化》
数据库·docker·容器
二等饼干~za8986684 小时前
geo优化源码开发搭建技术分享
大数据·网络·数据库·人工智能·音视频