mysql联合索引的使用规则

 更新时间:2021年06月23日 09:30:57   作者:有种放学你别走  
本文主要介绍了mysql联合索引的具体使用,结合实例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

联合索引又叫复合索引。对于复合索引: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选项:


结果可以看出,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联合索引的使用规则的文章就介绍到这了,更多相关mysql联合索引内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Sphinx/MySQL 协议支持与SphinxQL应用实例

    Sphinx/MySQL 协议支持与SphinxQL应用实例

    Sphinx/MySQL 协议支持与SphinxQL应用例子,供大家学习参考
    2013-02-02
  • mysql之key和index的区别及创建删除索引方式

    mysql之key和index的区别及创建删除索引方式

    这篇文章主要介绍了mysql之key和index的区别及创建删除索引方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • MySQL on k8s 云原生环境部署

    MySQL on k8s 云原生环境部署

    这篇文章主要为大家介绍了MySQL on k8s 云原生环境部署实现过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • MySQL中的join以及on条件的用法解析

    MySQL中的join以及on条件的用法解析

    这篇文章主要介绍了MySQL中的join以及on条件的用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • MySQL使用索引合并(Index Merge)提高查询效率

    MySQL使用索引合并(Index Merge)提高查询效率

    本文介绍了索引合并(Index Merge)的实现原理、场景约束与通过案例验证的优缺点,在实际使用中,当查询条件列较多且无法使用联合索引时,就可以考虑使用索引合并,利用多个索引加速查询,但要注意,索引合并并非在任何场景下均具有较好的效果,需要结合具体情况选择
    2024-07-07
  • MySql基本查询之表的增删查改+聚合函数案例详解

    MySql基本查询之表的增删查改+聚合函数案例详解

    本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE修改数据,DELETE删除数据并对比TRUNCATE,涵盖聚合函数、GROUP BY分组统计及经典练习题,强调操作注意事项与执行顺序,感兴趣的朋友一起看看吧
    2025-07-07
  • 从MySQL5.7平滑升级到MySQL8.0数据库的最佳实践教程

    从MySQL5.7平滑升级到MySQL8.0数据库的最佳实践教程

    这篇文章主要给大家介绍了关于从MySQL5.7平滑升级到MySQL8.0数据库的最佳实践,升级MySQL版本需要进行一系列操作,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2024-07-07
  • MySql恢复数据方法梳理讲解

    MySql恢复数据方法梳理讲解

    MySQL的binlog日志是MySQL日志中非常重要的一种日志,下面这篇文章主要给大家介绍了关于mysql如何利用binlog进行数据恢复的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • MySQL数值类型溢出的处理方法

    MySQL数值类型溢出的处理方法

    这篇文章主要给大家介绍了关于MySQL数值类型溢出的处理方法,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • Mysql如何导出筛选数据并导出带表头的csv文件

    Mysql如何导出筛选数据并导出带表头的csv文件

    这篇文章主要介绍了Mysql如何导出筛选数据并导出带表头的csv文件,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07

最新评论