不会吹比的程序猿不是好工程师 2019-05-16 11:22 采纳率: 75%
浏览 1385
已采纳

MySql的联合索引问题,求解

图片说明

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

  • 写回答

2条回答 默认 最新

  • little_how 2019-05-16 12:03
    关注

    只有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存储引擎下的索引结构和原理;
    希望可以帮到你....

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题