赣州新闻网

首页 / 科技

阿里公开招募小学生,普华永道接受高中生,大厂真的不看学历了?

2020-03-31 · 赣州新闻网 · 科技

作者:孤独烟 来自:孤独烟

引言

这篇文章作为《面试官:谈谈你对mysql索引的认识》的续篇,我当时在写这篇的时候,考虑到篇幅问题所以略去了联合索引的内容,今天给大家补上。本文预计分为两个部分:

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

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

(2)联合索引部分的实战题_ m ~ O

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

正文

基础

讲联合索引,一定要扯最左匹配!放心,我不扯有的没的,几句话懂个大概就行!最左匹配所谓最左原则指的就是如果你的 SQL 语句V 1 : E 0 :中用到了联合索引中的最左边的索引,那么这条 S. ` B c )QL 语句就可以利8 * [ ^用这个联合索引去进j 9 R ! 5 n )行匹配,值得注意的是,当遇到范围查询(>、<6 M q D ^ ^ W 5;、between、like)就会停止匹配。假设,我们对(a,b+ 2 C @ * X `)字段建立一个索引,也就是说,你where后条件为

a = 1
a = 1 and b = 2

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

b= 2 and a =1

也是能匹配到索引的,因为Mysql有优化器会自动C G S调整a,b的顺序与索* c r引顺序一致。相反的,你执行

b = 2

就匹配不到索引了。而你对(a,b,c,d)建立索引,where后条件为

a = 1 and b = 2 and&nbP : 1 M S y sp;c > 3 and d = 4 

那么,a,b,3 z y Q X f x dc三个字段能用到索引,而d就匹配不到。因为遇到了范围查询!

最左匹配7 % 9 E w ^ 2 x的原理?假设,我4 F l ! ~们对(a,b)字段建立索引,那么入下图所示

面试官:谈谈你对mysql联合索引的认识?

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

因此,我们可以看到a是有序的1,1,2,2,3,3。而b是一种全局无序,局部相对有序状态!什么意思呢?从全局来看,b的值为1,2,1,4,1,2,是无序的,因此直接执行b = 2这种查询条件没有办法利用索引。

从局部来看,当a的值确定的时0 Q J @ e 4 i Y 3候,b是有序的。例如a = 1时,b值为1,2是有序的状态。当a = 2时候,b的值为1,42 C X o 8 E l | f也是有序状态。因此,你执行a) t ` x % i V = 1 and b = 2时a,b字段能用到索引的。R ^ & 2而你执行a > 1 and b = 2时,a字段能用到索引,b字段用8 q k B不到索引。因为a的值此时是一个范围,不是固定的,在这h 0 L d K 6 $个范围内b值不D e [ s 3 T是有序的,因此 G 0 e @ 0ROM table WHERE a = 1 and b = 2 and c = 3; 

如何建立索引?如果此题回答为对(a,b,c)建立索引@ S S H U C j G R,那都可以: @ q _ Q回去等通知了。此题正确答法是T x N d V:(a,b,c)或者(c,b,a)或者(b,a,c)都可以,重点要的是将区分度高的字段放在前面,区分度低的字段放后面。像性别、状态这种字段区分度就很低,我们一般放后面。

例如假设区分度 e Y由大到小为b,a,c。那么我们就对(s J eb,a,c)建立索引@ p + W O j引?此题回答也是不一定,(b,a)或者(b,c)都可以,要结合具体情况具体分析。

拓展一下

SELECT *&n- N } 4bsp;FROM&w ~ Bnbsp;`` E 8 V E * ? s Ktable` WHERE a | n 6 ; d k q ~ ;= 1 and b =&= & +nbsp;2 and c > 3; 

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

题型四

SELECT * FROM `table` WHERE a = 1 ORDER&n| ? H d j { Hbsp;BY b;

如何建立索引?这还需要想?一看就是对(a,b)建索引,当a = 1的时候,b相对有序,可以避免再C 9 g Z S J次排序!那么

SELECT *&nL - ?bsp;FROM `tab{ F p D y / ;le` WHERE a > 1 ORDER BY b; 

如何建立索引?对(a)4 W , = . S Z h E建立索引,因为a的值y k G . D ] [ `是- S @ T x h一个范围,{ . =这个范围内b值是无序的,没有必要对(a,b)建I + h w 4 S S立索引。

拓展一下

SELECT * FROM `table`&nb/ 1 psp;WHERE a = 1 AND b =) 3 n 2 AND&nt R nbsp;c > 3&nbsM o w ? U j U P lp;ORDER BY c;

怎么建索引?

题型五

SELECT * FROM `table`&nbp _ Q R Usp;WHERE&D C { W 2nbsp;ax  J r b 7 IN&n- i P y Y X 7 ) Gbsp;(1,2,3) and&nbsZ l 1 x R b x / jp;b >&nbj . 4 ` y _ 3 _sp;1; 

如何建立索引?还是对(a,b)建立索引,因H I G y [ _ =为IN在这里可以视为等值引用,不会中止索引匹配,所以还是(a,b)!

拓展一下

SELECT * FROM `tabl@ 6 ~ S t f O R fe` WHERE a =B D J g 1 1 AND b IN&n# } .bsp;(1,2,3) AND c > 3 ORDER BY c;

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

总结

希望大家在面试的时候遇到联合索引的题目,能够答出来吧

文章代表内容经典不看有序学生龙南接受