不会吹比的程序猿不是好工程师 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 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记