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 Threads_running飙升与慢查询的相关问题解决
May 08 MySQL
MySQL 隔离数据列和前缀索引的使用总结
May 14 MySQL
MySQL官方导出工具mysqlpump的使用
May 21 MySQL
MySQL下使用Inplace和Online方式创建索引的教程
May 26 MySQL
为什么代码规范要求SQL语句不要过多的join
Jun 23 MySQL
解决mysql:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO/YES)
Jun 26 MySQL
SQL IDENTITY_INSERT作用案例详解
Aug 23 MySQL
weblogic服务建立数据源连接测试更新mysql驱动包的问题及解决方法
Jan 22 MySQL
mysql下的max_allowed_packet参数设置详解
Feb 12 MySQL
Mysql 如何合理地统计一个数据库里的所有表的数据量
Apr 18 MySQL
mysql中如何用命令创建联合唯一索引
Apr 20 MySQL
mysql性能优化以及配置连接参数设置
May 06 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
在命令行下运行PHP脚本[带参数]的方法
2010/01/22 PHP
php session劫持和防范的方法
2013/11/12 PHP
PHP使用gmdate实现将一个UNIX 时间格式化成GMT文本的方法
2015/03/19 PHP
如何使用纯PHP实现定时器任务(Timer)
2015/07/31 PHP
Javascript----文件操作
2007/01/18 Javascript
js 在定义的时候立即执行的函数表达式(function)写法
2013/01/16 Javascript
如何将一个String和多个String值进行比较思路分析
2013/04/22 Javascript
浅谈Javascript中匀速运动的停止条件
2014/12/19 Javascript
JavaScript动态提示输入框输入字数的方法
2015/07/27 Javascript
JavaScript实现点击单元格改变背景色的方法
2016/02/12 Javascript
Js获取图片原始宽高的实现代码
2016/05/17 Javascript
bootstrap jquery dataTable 异步ajax刷新表格数据的实现方法
2017/02/10 Javascript
深入理解AngularJs-scope的脏检查(一)
2017/06/19 Javascript
vue的基本用法与常见指令
2017/08/15 Javascript
vue使用axios时关于this的指向问题详解
2017/12/22 Javascript
详解Vue iview IE浏览器不兼容报错(Iview Bable polyfill)
2019/01/07 Javascript
layui: layer.open加载窗体时出现遮罩层的解决方法
2019/09/26 Javascript
pip 错误unused-command-line-argument-hard-error-in-future解决办法
2014/06/01 Python
Python简单生成随机姓名的方法示例
2017/12/27 Python
Python基于高斯消元法计算线性方程组示例
2018/01/17 Python
用Python3创建httpServer的简单方法
2018/06/04 Python
Python 中Django验证码功能的实现代码
2019/06/20 Python
python保存log日志,实现用log日志画图
2019/12/24 Python
解决ROC曲线画出来只有一个点的问题
2020/02/28 Python
Python3使用 GitLab API 进行批量合并分支
2020/10/15 Python
求两个数的乘积和商数,该作用由宏定义来实现
2013/03/13 面试题
咖啡厅创业计划书范本
2014/01/22 职场文书
2014端午节活动策划方案
2014/01/27 职场文书
机械制造毕业生求职信
2014/03/03 职场文书
中学生学雷锋活动心得体会
2014/03/10 职场文书
学历公证委托书
2014/04/09 职场文书
商超业务员岗位职责
2015/02/13 职场文书
少先大队干部竞选稿
2015/11/20 职场文书
Go语言中break label与goto label的区别
2021/04/28 Golang
Mysql如何实现不存在则插入,存在则更新
2022/03/25 MySQL
漫画《催眠麦克风-Dawn Of Divisions》第二卷PV公开
2022/04/05 日漫