常规理解:
利用索引中的附加列,您可以缩小搜索的范围,但使用一个具有两列的索引 不同于使用两个单独的索引。复合索引的结构与电话簿类似,人名由姓和名构成,电话簿首先按姓氏对进行排序,然后按名字对有相同姓氏的人进行排序。如果您知道姓,电话簿将非常有用;如果您知道姓和名,电话簿则更为有用,但如果您只知道名不姓,电话簿将没有用处。
所以说创建复合索引时,应该仔细考虑列的顺序。对索引中的所有列执行搜索或仅对前几列执行搜索时,复合索引非常有用;仅对后面的任意列执行搜索时,复合索引则没有用处。
多个单列索引在多条件查询时只会生效第一个索引!所以多条件联合查询时最好建联合索引!
下面亲自动手自测说明(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并没有用到!