MySql的联合索引问题,求解

图片说明

** 答案是ABCD?不是很确定,求大佬解答**

2个回答

只有A用了
这里就给你简单的解释一下mysql索引原理;
还有就是你可以先了解一下Btree,这样更容易了解;

1.mysql在innodb的存储引擎下使用的是btree索引,包括主键的聚簇索引和普通
的二级索引;


2.因为索引是用的btree,所以索引的叶子节点是按照索引键的顺序存储的;


3.2中提到的索引键的顺序,也就是通过比大小来存储,默认的字符串比大小是用ascii,而数字我就不多说了吧;


4.联合索引的建立是严格按照索引的顺序建立的;


然后现在来讲答案是为什么了;
A:答案条件是B and A的等号形式,mysql的查询优化器会将条件转换成B and A来进行查询,满足联合索引的从左到右;索引完美的用到了联合索引;
B:答案中只有到的B字段作为查询条件,不符合联合索引的从左到右

多说一句为什么联合索引是从左到右,因为btree索引在插入删除等时,是先从左边的字段开始比较大小,然后找到插入位置,然后再依次往右比较


C : 答案虽然用到了A字段,理论是可以用到索引的,但是mysql在几种情况下索引会失效,而使用表达式恰好是其中一种,tochar,substring,A + 2 =5这种都不可以,可以把表达式放在等号右边,如 A= 5 +2这样就可以用到联合索引中的A字段索引

D : 答案虽然也用到了A字段,但是用了like作为查询条件,也并不是说like就一定用不到索引,开始一直说了,索引的比较,如字符串的比较是ascii,而ascii
的比较方式是从左往右比较,如abc、abd、acd比较是先比第一位a,发现相同,再比第二位b和c,b相同再比;所以如果想要like的时候索引生效,那么必须是前缀表达如A like 'Y%'这种形式就可以用到索引,而'%Y'这种形式明显索引不知道前面的值就不可以做比较来判定;


这里只是简单的说明为什么答案中哪些使用了索引,哪些不能使用,想要理解本质,就得知道btree原理以及mysql的innodb存储引擎下的索引结构和原理;
希望可以帮到你....

w172087242
little_how 回复: 有个地方写错误了,就是扫描普通索引比聚簇索引的代价小,因为聚簇索引存储的信息量大
一年多之前 回复
w172087242
little_how 回复wayne.hu: 只有一种情况,B会扫描索引,而不是用索引查找,那就是查询字段里面只有主键和联合索引包含的情况下,会全索引扫描,因为扫描普通索引代价比聚簇索引大,但是也是全扫描索引,没法基于快速基于索引定位的
一年多之前 回复
w172087242
little_how 回复wayne.hu: B怎么可能用,B是联合索引的第二个字段,还有就是要反驳我当前给你的回复之前,先看看mysql联合索引的运行机制,然后再讨论,不然不在一个频道上
一年多之前 回复
hu_wen_wei
wayne.hu B用了哦,哪个公司的面试?
一年多之前 回复
kuqi007
不会吹比的程序猿不是好工程师 非常感谢!!
一年多之前 回复
kuqi007
不会吹比的程序猿不是好工程师 大佬求解,面试官也说是BCD
一年多之前 回复
A 用了,级别为const 使用唯一索引或者主键 (很高)
B用了,级别为index 索引全表扫描 (很低)
C没有用,用了函数就不会用索引
D用了,级别为range 索引范围扫描 (还行)
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐