Mysql联合索引和最左匹配原则

1.联合索引

联合索引:同时创建多个索引,右边索引以左边索引排序后的结果为前提条件进行排序,所以就有了最左匹配原则


联合索引的创建

CREATE TABLE `table_name`(`a` INT,`b` INT, `c` INT,PRIMARY KEY(`a`),KEY idx_a_b_c(`a`,`b`,`c`))
或
CREATE INDEX idx_a_b_c ON table_name(a,b,c)

2.最左匹配原则

2.1全匹配

select * from table_name where a = '1' and b = '2' and c = '3' 
select * from table_name where b = '2' and a = '1' and c = '3' 
select * from table_name where c = '3' and b = '2' and a = '1'

上面的查询语句都会触发联合查询,where子句几个搜索条件顺序调换不影响查询结果,因为Mysql中有查询优化器,会自动优化查询条件的顺序

2.2最左匹配原则

select * from table_name where a = '1' 
select * from table_name where a = '1' and b = '2'  
select * from table_name where a = '1' and b = '2' and c = '3'

上面查询语句会触发联合索引,简单来讲联合索引是先由第一个key建立索引,第二个索引是在第一个索引的基础上进行排序,所以说如果没有按照联合索引建立的顺序进行检索的话及不遵循最左匹配原则的话则不会触发索引,例如:

select * from table_name where  b = '2' 
select * from table_name where  c = '3'
select * from table_name where  b = '1' and c = '3'

都不会触发索引,是通过全表扫描进行查询的

2.3索引失效

索引失效的案例除了常见的一些以外,当进行范围查找是会中断联合索引,
例如a=1 and b=2此时a是精确查找,a,b都会触发索引
但当a>1 and b=2时,a进行了范围查找,虽然a触发了索引,但此时a是一个范围,在这个范围内b是无序的,所以b未能触发索引,所以说范围查找会中断索引
同理,a=1,b>2,c=3时,a,b都会匹配索引,但在a=1,b>2这个范围内c是无序的

2.4排序

1.排序也是需要按照最左匹配原则来进行匹配索引,例如:

select * from table_name order by a,b,c;

此时,数据库会根据我们传入的abc的顺序进行排序,会触发索引,另外例如:

select * from table_name order by a;
select * from table_name order by a,b;

这也是会触发部分索引,因为符合最左匹配原则


2.但是当我们改变abc的顺序进行排序时,则不会想查询条件一样进行自动的优化顺序,不会匹配索引,例如:

select * from table_name order by b,c,a;

联合索引左边列为常量,后边的列排序可以用到索引,例如:

select * from table_name where a=1 order by b,c;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值