zoukankan      html  css  js  c++  java
  • 联合索引本质

    常规理解:
    利用索引中的附加列,您可以缩小搜索的范围,但使用一个具有两列的索引 不同于使用两个单独的索引。复合索引的结构与电话簿类似,人名由姓和名构成,电话簿首先按姓氏对进行排序,然后按名字对有相同姓氏的人进行排序。如果您知道姓,电话簿将非常有用;如果您知道姓和名,电话簿则更为有用,但如果您只知道名不姓,电话簿将没有用处。

    所以说创建复合索引时,应该仔细考虑列的顺序。对索引中的所有列执行搜索或仅对前几列执行搜索时,复合索引非常有用;仅对后面的任意列执行搜索时,复合索引则没有用处。

    多个单列索引在多条件查询时只会生效第一个索引!所以多条件联合查询时最好建联合索引!

    下面亲自动手自测说明(mysql 版本 5.7.22

    表credit_score_log 根据三个字段建联合索引

    KEY `idx_account_city_comp` (`credit_account_id`,`city_code`,`comp_code`),

    我们知道联合索引符合最左原则。(A,A+B,A+B+C)

    即credit_account_id / credit_account_id + city_code / credit_account_id + city_code + comp_code 都会走这个联合索引(分别对应下边三个例子)

    例如:

    SELECT * FROM credit_score_log where credit_account_id='723705';

    查看执行计划如下

    例如

    SELECT * FROM credit_score_log where credit_account_id='723705' and  city_code='110000';

    查看执行计划如下

     例如:

    SELECT * FROM credit_score_log where credit_account_id='723705' and  city_code='110000' and comp_code='A10001';

    查看执行计划如下

     

    但是,猜测 A+C走不走联合索引呢,即 credit_account_id + comp_code 是否走联合索引,SQL如下

    SELECT * FROM credit_score_log where credit_account_id='723705' and comp_code='A10001';

    执行计划如下

    发现 A+C 竟然也走了联合索引!,和 根据条件 A 查的结果一样 key_len ( 实际用到真实索引的长度 )  长度都是8 ,所以推测 走的是 A 的索引!

    联合索引本质:

    当创建(A,B,C)联合索引时,相当于创建了(A)单列索引,(A,B)联合索引以及(A,B,C)联合索引 
    想要索引生效的话,只能使用 A和 A+B 和 A+B+C 三种组合;当然,我们上面测试过,A+C 组合也可以,但实际上只用到了A 的索引,C并没有用到! 

  • 相关阅读:
    金额与数字转化常用实用几个JS方法
    Jdb命令 The Java Debugger
    GLOBAL TEMPORARY TABLE
    安装与配置Nginx
    MySQL二进制安装与密码破解
    基于FPM构建企业RPM包
    安装Tomcat
    nginx配置优化
    DHCP原理及配置(三个小实验)
    DNS主、从服务器的配置
  • 原文地址:https://www.cnblogs.com/wanghongsen/p/10181346.html
Copyright © 2011-2022 走看看