美文网首页
联合索引

联合索引

作者: 偏丶執 | 来源:发表于2020-12-29 22:33 被阅读0次

本文预计分为两个部分:

(1)联合索引部分的基础知识

在这个部分,我们温习一下联合索引的基础

(2)联合索引部分的实战题

在这个部分,列举几个我认为算是实战中的代表题,挑出来说说。

正文

基础

讲联合索引,一定要扯最左匹配!放心,我不扯有的没的,几句话懂个大概就行!

最左匹配

所谓最左原则指的就是如果你的 SQL 语句中用到了联合索引中的最左边的索引,那么这条 SQL 语句就可以利用这个联合索引去进行匹配,值得注意的是,当遇到范围查询(>、<、between、like)就会停止匹配。

假设,我们对(a,b)字段建立一个索引,也就是说,你where后条件为

a=1a=1and b =2

是可以匹配索引的。但是要注意的是~你执行

b=2and a =1

也是能匹配到索引的,因为Mysql有优化器会自动调整a,b的顺序与索引顺序一致。

相反的,你执行

b=2

就匹配不到索引了。

而你对(a,b,c,d)建立索引,where后条件为

a =1andb =2andc >3andd =4

那么,a,b,c三个字段能用到索引,而d就匹配不到。因为遇到了范围查询!

最左匹配的原理?

假设,我们对(a,b)字段建立索引,那么入下图所示

如图所示他们是按照a来进行排序,在a相等的情况下,才按b来排序。

因此,我们可以看到a是有序的1,1,2,2,3,3。而b是一种全局无序,局部相对有序状态!

什么意思呢?

从全局来看,b的值为1,2,1,4,1,2,是无序的,因此直接执行b = 2这种查询条件没有办法利用索引。

从局部来看,当a的值确定的时候,b是有序的。例如a = 1时,b值为1,2是有序的状态。当a=2时候,b的值为1,4也是有序状态。

因此,你执行a = 1 and b = 2是a,b字段能用到索引的。而你执行a > 1 and b = 2时,a字段能用到索引,b字段用不到索引。因为a的值此时是一个范围,不是固定的,在这个范围内b值不是有序的,因此b字段用不上索引。

综上所示,最左匹配原则,在遇到范围查询的时候,就会停止匹配。

实战

OK,懂上面的基础,我们就可以开始扯了~我举了经典的五大题型,看完基本就懂!

题型一

如果sql为

SELECT*FROMtableWHEREa =1andb =2andc =3;

如何建立索引?

如果此题回答为对(a,b,c)建立索引,那都可以回去等通知了。

此题正确答法是,(a,b,c)或者(c,b,a)或者(b,a,c)都可以,重点要的是将区分度高的字段放在前面,区分度低的字段放后面。像性别、状态这种字段区分度就很低,我们一般放后面。

例如假设区分度由大到小为b,a,c。那么我们就对(b,a,c)建立索引。在执行sql的时候,优化器会 帮我们调整where后a,b,c的顺序,让我们用上索引。

题型二

如果sql为

SELECT*FROMtableWHEREa >1andb =2;

如何建立索引?

如果此题回答为对(a,b)建立索引,那都可以回去等通知了。

此题正确答法是,对(b,a)建立索引。如果你建立的是(a,b)索引,那么只有a字段能用得上索引,毕竟最左匹配原则遇到范围查询就停止匹配。

如果对(b,a)建立索引那么两个字段都能用上,优化器会帮我们调整where后a,b的顺序,让我们用上索引。

题型三

如果sql为

SELECT*FROM`table`WHEREa >1andb =2andc >3;

如何建立索引?

此题回答也是不一定,(b,a)或者(b,c)都可以,要结合具体情况具体分析。

拓展一下

SELECT*FROM`table`WHEREa =1andb =2andc >3;

怎么建索引?嗯,大家一定都懂了!

题型四

SELECT*FROM`table`WHEREa =1ORDERBYb;

如何建立索引?

这还需要想?一看就是对(a,b)建索引,当a = 1的时候,b相对有序,可以避免再次排序!

那么

SELECT*FROM`table`WHEREa >1ORDERBYb;

如何建立索引?

对(a)建立索引,因为a的值是一个范围,这个范围内b值是无序的,没有必要对(a,b)建立索引。

拓展一下

SELECT*FROM`table`WHEREa =1ANDb =2ANDc >3ORDERBYc;

怎么建索引?

题型五

SELECT*FROM`table`WHEREaIN(1,2,3)andb >1;

如何建立索引?

还是对(a,b)建立索引,因为IN在这里可以视为等值引用,不会中止索引匹配,所以还是(a,b)!

拓展一下

SELECT*FROM`table`WHEREa =1ANDbIN(1,2,3)ANDc >3ORDERBYc;

如何建立索引?此时c排序是用不到索引的。

相关文章

  • MySQL-联合索引

    一、什么是联合索引 两个或更多个列上的索引被称作联合索引,联合索引又叫复合索引。对于复合索引:Mysql从左到右的...

  • Mysql

    2020-01-21 联合索引本质 当创建(a,b,c)联合索引时,相当于创建了(a)单列索引,(a,b)联合索引...

  • 索引的技术点

    联合索引:多字段组合索引,加速组合条件查询 联合索引要满足从左到右的查询需求,例如(a,b,c)的联合索引,能够加...

  • MySQL - 索引优化技巧

    联合索引 在建立索引的时候,尽量在多个单列索引上判断下是否可以使用联合索引,联合索引使用不仅可以节省空间,还可以更...

  • 索引

    联合索引 (a,b,c)联合索引 (a,b,c) 实际建立了 (a)、(a,b)、(a,b,c) 三个索引 如下:...

  • 联合索引-以及如何使用索引

    联合索引 建立索引的时候,尽量建立联合索引,即多个字段组成1个索引。因为如果针对单个字段建立索引的话,会造成索引过...

  • 索引:联合索引和单个索引的区别

    联合索引和单个索引的区别 联合索引和单个索引的区别: 最佳左前缀:  如果我们创建了(area, age,sala...

  • MYSQL实战优化——索引介绍二

    联合索引查询原理 之所以介绍联合索引,是因为平时我们设计系统的时候一般都是设计联合索引,因为我还是要尽可能的让索引...

  • Mysql

    索引(一般监控到慢SQL,才会建索引) 前缀索引 常见索引误区 多列联合索引 左前缀例子(是一种联合索引的匹配规则...

  • 联合索引

    索引 索引的使用 什么时候使用索引表的主关键字 表的字段唯一约束 直接条件查询的字段 查询中与其它表关联的字段 查...

网友评论

      本文标题:联合索引

      本文链接:https://www.haomeiwen.com/subject/kvzqoktx.html