mysql-联合索引

阅读量: zyh 2015-03-29 12:33:11
Categories: > Tags:

联合索引的本质:最左匹配

联合索引又叫联合索引。对于联合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。

mysql联合索引原理及失效条件

当创建(col1,col2,col3)联合索引时,相当于创建了**(col)单列索引**,(clo1,clo2)联合索引以及**(col1,col2,col3)联合索引**。

想要索引生效,只能使用col1col1,col2col1,col2,col3三种组合。当然,col1,col3组合也可以,但实际上只用到了col1的索引,col3并没有用到

例如:

索引是key index (a,b,c)。可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 。当最左侧字段是常量引用时,索引就十分有效。

图解

image-20220517145349119

以实际例子说明

联合索引的结构与电话簿类似,人名由姓和名构成,电话簿首先按姓氏对进行排序,然后按名字对有相同姓氏的人进行排序。如果您知 道姓,电话簿将非常有用;如果您知道姓和名,电话簿则更为有用,但如果您只知道名不姓,电话簿将没有用处。

ℹ️即:依然满足最左原则,任何查找,从最左边索引列开始。

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

1、只命中 col1,col2

SELECT * FROM `table_name` WHERE `col1`='XX';
 

2、命中col1,col2。col1,col2的顺序可以颠倒

SELECT * FROM `table_name` WHERE `clo1`='XX' AND `clo2`='XXX'; 
SELECT * FROM `table_name` WHERE `clo2`='XXX' AND `clo1`='XX';  
 

3、命中col1,col2,col3,同理,三个列的顺可以颠倒

SELECT * FROM `table_name` WHERE `col1`='X' AND `col2`='XX' AND `col3`='XXX';
SELECT * FROM `table_name` WHERE `col1`='X' AND `col3`='XX' AND `col2`='XXX';
SELECT * FROM `table_name` WHERE `col2`='X' AND `col3`='XX' AND `col1`='XXX';

命令

# 创建
ALTER TABLE `table_name` ADD INDEX (`col1`,`col2`,`col3`);
# 删除
drop index index_name on table_name ;

联合索引的索引体积比单独索引的体积要小,而且只是一个索引树,相比单独列的索引要更加的节省时间复杂度和空间复杂度。

总结

命名规则:表名_字段名

1、需要加索引的字段,要在where条件中

2、数据量少的字段不需要加索引

3、如果where条件中是OR关系,加索引不起作用

4、符合最左原则