介绍
本文是《面试官:谈谈你对mysql索引的理解》的续篇。我在写这篇文章的时候,由于篇幅问题,省略了联合索引的内容。我今天会补偿你的。本文预计分为两部分:
(1)联合指标部分的基础知识
在这一节中,让我们回顾一下联邦索引的基础。
(2)联合索引部分的实际问题
这一部分,列举几个我认为实战中有代表性的问题,挑出来。
主体
基础
说到关节索引,一定要拉最左边的匹配!放心吧,我什么都不说,就懂几个字!最左匹配最左原则是指如果在你的SQL语句中使用了联合索引中最左的索引,那么这条SQL语句就可以使用这个联合索引进行匹配。值得注意的是,当遇到范围查询(>:、& lt,between,like)会停止匹配。假设,我们建立一个(a,b)域的索引,也就是在你where之后,条件是
a = 1a = 1 and b = 2
它可以匹配索引。但是要注意的是~你执行
b= 2 and a =1
也可以匹配到索引,因为Mysql有一个优化器,会自动调整A和B的顺序,使之与索引顺序一致。相反,你表演
b = 2
你比不上指数。而你索引(a,b,c,d),where之后的条件是
a = 1 and b = 2 and c > 3 and d = 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和b = 2时,可以对A和B字段进行索引。而你执行A >:当1和b = 2时,字段A可以被索引,但字段B不能被索引。因为此时A的值是一个范围,不是固定的,B的值在这个范围内是不排序的,所以B字段不能被索引。
综上所述,最左匹配原则遇到范围查询会停止匹配。
真正的战斗
好了,以上基础你懂了,我们就可以开始拉~我引用了经典的五个问题,你看完就明白了!
问题类型一
如果sql是
SELECT * FROM table WHERE a = 1 and b = 2 and c = 3;
如何建立一个指数?如果这个问题的答案是index (a,b,c),可以回去等通知。这个问题的正确答案是:(a,b,c)或者(c,b,a)或者(b,a,c)。重要的是把区分度高的领域放在前面,把区分度低的领域放在后面。性别、地位等字段的区分度较低,我们一般会放在后面。
例如,假设区分度从大到小依次为b、A、C、A、C。然后我们将索引(b,a,c)。在执行sql的时候,优化器会帮助我们调整where之后A,B,C的顺序,这样就可以使用索引了。
第二个问题类型
如果sql是
SELECT * FROM table WHERE a > 1 and b = 2;
如何建立一个指数?如果这个问题的答案是index (a,b),可以回去等通知。这个问题的正确答案是index (b,a)。如果构建(A,b)索引,那么只有A字段可以用于索引。毕竟最左匹配原则遇到范围查询就停止匹配。如果(b,a)被索引,那么两个字段都可以使用。优化器会帮助我们调整where之后A和B的顺序,这样我们就可以使用索引了。
三类问题
如果sql是
SELECT * FROM `table` WHERE a > 1 and b = 2 and c > 3;
如何建立一个指数?这个问题的答案不一定,(b,a)和(b,c)都可以,要结合具体情况具体分析。
展开。
SELECT * FROM `table` WHERE a = 1 and b = 2 and c > 3;
如何建立一个指数?嗯,大家一定要理解!
四类问题
SELECT * FROM `table` WHERE a = 1 ORDER BY b;
如何建立一个指数?这还需要考虑吗?一看就是为了索引(a,b)。当a = 1时,B相对有序,可以避免重新排序!因此
SELECT * FROM `table` WHERE a > 1 ORDER BY b;
如何建立一个指数?Index (A),因为A的值是一个范围,在这个范围内B的值是乱序的,所以不需要index (a,B)。
展开。
SELECT * FROM `table` WHERE a = 1 AND b = 2 AND c > 3 ORDER BY c;
如何建立一个指数?
五个问题
SELECT * FROM `table` WHERE a IN (1,2,3) and b > 1;
如何建立一个指数?或者INdex (a,b),因为in在这里可以视为等价引用,索引匹配不会停止,所以还是(a,b)!
展开。
SELECT * FROM `table` WHERE a = 1 AND b IN (1,2,3) AND c > 3 ORDER BY c;
如何建立一个指数?此时,索引不用于C排序。
摘要
希望你能在面试的时候回答一下联指的问题。
本文来自奶味小仙女投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/634948.html