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

假设某个表有一个联合索引(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选项:

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

将c2条件去掉后:

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

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

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

B选项:

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

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

C选项:

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

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

D选项:

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

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

E选项:

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

综上所述问题答案:

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

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

C:c1字段使用该索引

D:c1字段使用该索引

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

总结:

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

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

mysql联合索引的使用规则相关推荐

  1. mysql 联合索引的命中规则_可能是全网最好的MySQL重要知识点/面试题总结

    标题有点标题党的意思,看了文章之后希望大家不会有这个想法,绝对干货!!!这篇花文章是我花了几天时间对之前总结的MySQL知识点做了完善后的产物,这篇文章可以用来回顾MySQL基础知识以及备战MySQL ...

  2. MySQL联合索引(abc)命中规则

    1.建表 mysql创建一张表,表名:'test_models' id列为 主键,int类型 ,自增 a,b,c,d,e 全部是int(11) 为(a,b,c)添加一个联合索引 index_abc 执 ...

  3. MySQL数据库联合索引的命中规则

    一.联合索引的使用 本文中联合索引的定义为(MySQL): ALTER TABLE table_name ADD INDEX (col1,col2,col3); 二.联合索引的本质 当创建(col1, ...

  4. 找到符合条件的索引_高频面试题:MySQL联合索引的最左前缀匹配原则

    前言 之前在网上看到过很多关于mysql联合索引最左前缀匹配的文章,自以为就了解了其原理,最近面试时和面试官交流,发现遗漏了些东西,这里自己整理一下这方面的内容. 最左前缀匹配原则 在mysql建立联 ...

  5. mysql联合索引怎么存储_联合索引在B+树上的存储结构及数据查找方式

    能坚持别人不能坚持的,才能拥有别人未曾拥有的. 关注编程大道公众号,让我们一同坚持心中所想,一起成长!! 引言 上一篇文章<MySQL索引那些事>主要讲了MySQL索引的底层原理,且对比了 ...

  6. MySQL联合索引or_MySQL联合索引命中条件

    转于:https://blog.csdn.net/claram/article/details/77574600 首先明确:为什么要用联合索引? 对于查询语句"SELECT E.* FROM ...

  7. mysql 联合索引 命中_mysql联合索引命中条件

    转于:https://blog.csdn.net/claram/article/details/77574600 首先明确:为什么要用联合索引? 对于查询语句"SELECT E.* FROM ...

  8. 深入浅析Mysql联合索引原理 之 最左匹配原则。

    前言 之前在网上看到过很多关于mysql联合索引最左前缀匹配的文章,自以为就了解了其原理,最近面试时和大牛交流中,发现遗漏了些东西,这里自己整理一下这方面的内容. 最左前缀匹配原则 在mysql建立联 ...

  9. mysql联合索引的数据结构

    一.本文主要讲解的内容有: 联合索引在B+树上的存储结构 联合索引的查找方式 为什么会有最左前缀匹配原则 在分享这篇文章之前,我在网上查了关于MySQL联合索引在B+树上的存储结构这个问题,翻阅了很多 ...

最新文章

  1. docker 命令详解(cp篇)
  2. resultMap和resultType的区别
  3. 【组合数学】生成函数 ( 线性性质 | 乘积性质 )
  4. SAP ABAP Debug 小技巧
  5. QML基础类型之vector4d
  6. 通过Github Teams进行代码仓库的权限访问控制
  7. 在SAP云平台上部署和运行Docker应用
  8. java 监听本地端口_Java-在本地端口上侦听RTP数据包
  9. bettertouchtool闪退_BetterTouchTool for Mac 3.238 无闪退 触控板增强工具
  10. 鹅厂应届生在600人大群怒怼管理层,反内卷从手撕领导开始......
  11. 数据库优化常用的途径(方法)
  12. verilog中~在判断中的作用
  13. 腾讯云— LAMP 架构个人实践分享
  14. ADS软件仿真的问题
  15. 最坑人的辨色大比拼微信小游戏源码
  16. mysql中的left_MySQL left()函数
  17. 401832-00-4,Thalidomide-O-PEG4-Amine在EDC或HATU存在下与NHS酯基或羧酸反应的合成化合物
  18. sigmod函数求导
  19. 游戏里面的英雄是怎么做的?
  20. 数据加密技术在计算机网络安全中的应用实例,数据加密技术在计算机网络安全中的应用.doc...

热门文章

  1. 【Suatin】不学编译原理就制作语言2——Concrete Syntax Tree
  2. 孟岩亮相TokenSky,首谈通证的多维、多阶、多态体系
  3. 孟岩所说的革命到底是什么?
  4. 初级程序员和高级程序员的区别,你了解吗?
  5. Android面试之Activity生命周期详解
  6. Python 轻松解决从 K 个字符串数组中任意取一个字符串,按顺序拼接,列出所有可能的字符串组合。(对比用库和不用库的方法)
  7. 一般各类模具开模周期
  8. Centos8.5无法用yum安装screen,iftop,nethogs等的解决办法
  9. [YLANDS][艾兰岛][校长组件]键值对数组(字典)
  10. Matlab axis函数应用简介