MySQL索引最左匹配原则

一、explain 关键字

在弄懂MySQL索引的最左匹配原则之前,我们需要先了解一下 explain 关键字

我在学习explain关键字的时候找到了一张很好的图,但是我现在找不到出处了,只记得是在思否上面的,如果侵权联系我删掉

在这里插入图片描述


二、创建数据库

create table test(
a int ,
b int,
c int,
d int,
key index_abc(a,b,c)
)engine=InnoDB default charset=utf8;
DROP PROCEDURE IF EXISTS proc_initData;
DELIMITER $
CREATE PROCEDURE proc_initData()
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i<=10000 DO
    INSERT INTO test(a,b,c,d) VALUES(i,i,i,i);
    SET i = i+1;
END WHILE;
END $
CALL proc_initData();

这样我们就插入了1000条数据,和创建了a b c的联合索引


三、最左匹配原则

我们知道给字段创建了索引,只有我们使用了该字段,才会使用上索引,上面创建了联合索引 abc,假设我们不知道索引的使用规则,我们以最基本的思考,a、b、c,三个变量能够组合成多少种情况呢?

索引字段具体使用是否使用索引
aselect * from test where a < 10
bselect * from test where b < 10
cselect * from test where c < 10
a、bselect * from test where a < 10 and b < 10
b、aselect * from test where b < 10 and a < 10
a、cselect * from test where a < 10 and c < 10
c、aselect * from test where c < 10 and a < 10
b、cselect * from test where b < 10 and c < 10
c、bselect * from test where c < 10 and b < 10
a、b、cselect * from test where a < 10 and b < 10 and c < 10
a、c、bselect * from test where a < 10 and c < 10 and b < 10
b、a、cselect * from test where b < 10 and a < 10 and c < 10
b、c、aselect * from test where b < 10 and c < 10 and a < 10
c、a、bselect * from test where c < 10 and a < 10 and b < 10
c、b、aselect * from test where c < 10 and b < 10 and a < 10

注:上面代码都是sql,如果你想验证是否使用索引,在sql前面加上explain关键字即可

从上面的表格中我们可以做如下总结(也就是最左匹配原则了)
  • 索引的使用只和字段有关,和字段的排序无关
  • 从上面我们可以得出,创建了4个索引,a、ab、ac、abc(注意排序无关)
  • 最左匹配原则就是只要使用到了组合索引的第一个,索引即可生效

本文参考:

https://www.cnblogs.com/applelife/p/10516277.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL索引最左匹配原则是指在使用复合索引进行查询时,必须按照索引的最边的列开始匹配,然后再逐个匹配剩余的列。如果不按照索引的最边的列进行匹配,MySQL将无法利用索引,而需要进行全表扫描,对性能会产生很大的影响。\[1\]\[2\]\[3\] 举个例子,如果有一个由(a, b, c)组成的复合索引,那么在查询时必须先使用a进行过滤,然后才能使用b或c进行过滤,即使b或c也属于索引的一部分。如果不按照这个顺序进行查询,MySQL将无法使用索引进行优化。\[3\] 需要注意的是,最前缀匹配原则只适用于联合索引,而不适用于单列索引。在建立联合索引时,最前缀匹配原则可以帮助我们优化查询性能,提高查询效率。\[2\] #### 引用[.reference_title] - *1* *3* [MySQL最左匹配原则](https://blog.csdn.net/weixin_52060913/article/details/130615245)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Mysql 联合索引最左匹配原则](https://blog.csdn.net/Klaus_S/article/details/130972214)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值