mysql联合索引的使用规则


Posted in MySQL onJune 23, 2021

联合索引又叫复合索引。对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效。

从一道有趣的题目开始分析:

假设某个表有一个联合索引(c1,c2,c3,c4)以下选项哪些字段使用了该索引:
A where c1=x and c2=x and c4>x and c3=x
B where c1=x and c2=x and c4=x order by c3
C where c1=x and c4= x group by c3,c2
D where c1=? and c5=? order by c2,c3
E where c1=? and c2=? and c5=? order by c2,c3

下面我们开始:

首先创建表:

CREATE TABLE t(
c1 CHAR(1) not null,
c2 CHAR(1) not null,
c3 CHAR(1) not null,
c4 CHAR(1) not null,
c5 CHAR(1) not null
)ENGINE myisam CHARSET UTF8;

有c1到c5 5个字段,特别说明一下 字段类型都是定长char(1)类型,并且非空,字符集是utf8(与计算索引使用字节数有关)

创建索引:

alter table t add index c1234(c1,c2,c3,c4);

插入2条数据:insert into t VALUES('1','1','1','1','1'),('2','2','2','2','2')

使用MySql Explain开始分析题目结果:

A选项:

mysql联合索引的使用规则

mysql联合索引的使用规则

结果可以看出,c1,c2,c3,c4均使用到了该索引,而我们对A结果稍作更改:

将c2条件去掉后:

mysql联合索引的使用规则

根据索引最左原则,c2字段没有使用索引,c2之后的字段都不能使用索引。下面2图我们对比下索引最左原则:

mysql联合索引的使用规则

上图结果显示直接使用c3是全表查询,无法使用该索引的,所以c3字段使用索引的前提是c1,c2两字段均使用了索引。

即是索引的最左原则(左前缀原则)。

B选项:

mysql联合索引的使用规则

key_len长度说明c1,c2字段用到了该索引,Extra显示并没有使用临时表进行排序,说明排序是使用了索引的,但并没有计算在key_len值中,也没有起到连接c4的作用,说明索引到c3这里是断掉的。

排序其实是利用联合索引直接完成了的,即:使用了c1234联合索引,就已经使得c1下c2,c2下c3,c3下c4是有序的了,所以实际是排序利用了索引,c3字段并没有使用该索引。(这段写的时候总感觉有点别扭,不知道我理解的对不对,还有待更深层次的研究)

C选项:

mysql联合索引的使用规则

使用group by 一般先生成临时文件,再进行排序,但是字段顺序为c2,c3时,并没有用临时表进行排序,而是利用索引排序好的;当group by字段为c3,c2时,由于与索引字段顺序不一致,所以分组和排序并没有利用到索引。

由key_len长度确定,只有c1一个字段使用了索引。

D选项:

mysql联合索引的使用规则

order by 和group by 类似,字段顺序与索引一致时,会使用索引排序;字段顺序与索引不一致时,不使用索引。

由key_len长度确定,只有c1一个字段使用了索引。

E选项:

mysql联合索引的使用规则

其实选项E的结果分析在上述ABCD的结果中都分析过了,这里只有c1,c2字段使用了该索引。

综上所述问题答案:

A:四个字段均使用了该索引

B:c1,c2字段使用了该索引

C:c1字段使用该索引

D:c1字段使用该索引

E:c1,c2字段使用了该索引

总结:

索引的最左原则(左前缀原则),如(c1,c2,c3,c4....cN)的联合索引,where 条件按照索引建立的字段顺序来使用(不代表and条件必须按照顺序来写),如果中间某列没有条件,或使用like会导致后面的列不能使用索引。

索引也能用于分组和排序,分组要先排序,在计算平均值等等。所以在分组和排序中,如果字段顺序可以按照索引的字段顺序,即可利用索引的有序特性。

到此这篇关于mysql联合索引的使用规则的文章就介绍到这了,更多相关mysql联合索引内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
MySQL学习总结-基础架构概述
Apr 05 MySQL
MySQL infobright的安装步骤
Apr 07 MySQL
MySQL性能压力基准测试工具sysbench的使用简介
Apr 21 MySQL
仅用一句SQL更新整张表的涨跌幅、涨跌率的解决方案
May 06 MySQL
MySQL 不等于的三种使用及区别
Jun 03 MySQL
解析MySQL binlog
Jun 11 MySQL
MySQL中datetime时间字段的四舍五入操作
Oct 05 MySQL
分享mysql的current_timestamp小坑及解决
Nov 27 MySQL
mysql分组后合并显示一个字段的多条数据方式
Jan 22 MySQL
mysql 排序失效
May 20 MySQL
MYSQL如何查看操作日志详解
May 30 MySQL
mysql函数之截取字符串的实现
Aug 14 MySQL
为什么代码规范要求SQL语句不要过多的join
详解MySQL多版本并发控制机制(MVCC)源码
MySQL快速插入一亿测试数据
MySQL8.0.18配置多主一从
Jun 21 #MySQL
MySQL中日期型单行函数代码详解
如何搭建 MySQL 高可用高性能集群
Jun 21 #MySQL
MySQL 发生同步延迟时Seconds_Behind_Master还为0的原因
Jun 21 #MySQL
You might like
一个oracle+PHP的查询的例子
2006/10/09 PHP
php中使用redis队列操作实例代码
2013/02/07 PHP
php中的常用魔术方法汇总
2016/02/14 PHP
php+ajax 文件上传代码实例
2019/03/18 PHP
利用javaScript实现点击输入框弹出窗体选择信息
2013/12/11 Javascript
JS仿京东移动端手指拨动切换轮播图效果
2020/04/10 Javascript
js实现做通讯录的索引滑动显示效果和滑动显示锚点效果
2017/02/18 Javascript
vue mint-ui学习笔记之picker的使用
2017/10/11 Javascript
详解angular2如何手动点击特定元素上的点击事件
2018/10/16 Javascript
基于vue手写tree插件的那点事儿
2019/08/20 Javascript
Node.js API详解之 util模块用法实例分析
2020/05/09 Javascript
[45:18]2018DOTA2亚洲邀请赛 4.3 突围赛 Optic vs iG 第一场
2018/04/04 DOTA
[28:57]EG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/16 DOTA
python抓取京东商城手机列表url实例代码
2013/12/18 Python
Python实现将n个点均匀地分布在球面上的方法
2015/03/12 Python
Python实现抓取城市的PM2.5浓度和排名
2015/03/19 Python
Python中处理字符串之islower()方法的使用简介
2015/05/19 Python
Python中音频处理库pydub的使用教程
2017/06/07 Python
Python实现时钟显示效果思路详解
2018/04/11 Python
Python定义一个跨越多行的字符串的多种方法小结
2018/07/19 Python
Python绘图之柱形图绘制详解
2020/07/28 Python
最新Python idle下载、安装与使用教程图文详解
2020/11/28 Python
使用Python爬取小姐姐图片(beautifulsoup法)
2021/02/11 Python
AmazeUI 评论列表的实现示例
2020/08/13 HTML / CSS
Reebok官方旗舰店:美国知名健身品牌锐步
2019/01/07 全球购物
计算机应用专业学生的自我评价分享
2013/11/03 职场文书
会计出纳员的自我评价
2014/01/15 职场文书
党员领导干部廉洁从政承诺书
2014/03/27 职场文书
大学生万能检讨书范例
2014/10/04 职场文书
2015年工会工作总结
2015/03/30 职场文书
起诉意见书范文
2015/05/19 职场文书
预备党员转正党小组意见
2015/06/01 职场文书
高中同学会致辞
2015/08/01 职场文书
微信小程序用户授权最佳实践指南
2021/05/08 Javascript
Python道路车道线检测的实现
2021/06/27 Python
《原神》新角色演示“神里绫人:林隐泓洄” 宠妹狂魔
2022/04/03 其他游戏