发布时间:2021-08-18 09:07:54 阅读次数:235
联合索引的所有列,按照从左到右的顺序构成一个节点,保存在B+树中。
联合索引的最左前缀原则:联合索引是按照索引列的顺序,从第一列开始进行排序的。如果查询条件跳过了第一列,那么其实是无序的,就无法走索引,只能全表扫描。
单字段索引不能满足你了,那就多来几个...
创建普通索引的时候,指定两个或更多的字段 这就是联合索引,语法如下
alter table 表 add index 索引名(字段1,字段2)
维护数据库时发现现索引重复了?
这时可以删掉重复的索引,释放内存空间,提高查询效率
#因为联合索引(A,B)相当于创建了(A)和(A,B)索引 KEY idx_Id (Id) KEY idx_Id_age (Id, age) #所以这里可以删除Id 这个索引;
联合索引 "idx_id_age " ,id在前,age在后 #符合最左匹配原则 select * from user where id=10 and age =10; #符合最左匹配原则 select * from user where id =10;#age在前就不符合最左匹配原则,即不会用到索引 select * from user where age =10 and id =10;
当我们创建一个联合索引的时候,如(k1,k2,k3),相当于创建了(k1)、(k1,k2)和(k1,k2,k3)三个索引,这就是最左匹配原则。
如果遇到了范围查询,比如(<)(>)和 between 等, 会停止匹配,那后面的列就不会用到联合索引了。
where k1 > 1 AND k2 = 2 AND k3 = 3#这里k1 使用了范围查询,所以后面的k2,和k3 列就不会使用到联合索引了
这里有几条SQL语句,说说它们分别用到了哪个索引呢?
1.SELECT x, y, z FROM table WHERE y=2 AND x>1 AND z=32.SELECT x, y, z FROM table WHERE y=2 AND x=1 AND z>33.SELECT x, y, z FROM table WHERE y=2 AND x=1 AND z=34.SELECT x, y, z FROM table WHERE y>2 AND x=1 AND z=3
结果是 : 这四条语句都会用到索引!!
1: WHERE y=2 AND x>1 AND z=3 -- 使用索引(x,y,z)的x列。 #x是范围列,索引列最多作用于一个范围列,范围列之后的y列和z列无法使用索引。2: WHERE y=2 AND x=1 AND z>3 -- 完整使用索引(x,y,z)。3: WHERE y=2 AND x=1 AND z=3 -- 完整使用索引(x,y,z)。4: WHERE y>2 AND x=1 AND z=3 -- 使用索引(x,y,z)的x列和y列。 #y是范围列,索引列最多作用于一个范围列,范围列之后的z列无法使用索引。