mysql最左_Mysql最左原则

1. 前言

偶然看到一个技术群,对一道关于联合索引的讨论。面试题如下:

a_b_c_index 三列复合索引 a =1 and b<100 and c=5 这个查询 会用到索引的那几部分?

复制代码

先说下个人经过本人查询多方资料得到的结论, 只会用到 a 和 b部分(这里和群里小伙伴的讨论结果一致,如果有疑问可以后续探讨)。

2. 验证

要验证这个需要观察explain结果中 key、key_len。key 代表用到的索引。key_len 代表索引使用的字节数,当索引的类型为int且默认值可以为null的时候,用到索引则key_len为4。

接下来是表结构:

CREATE TABLE `test` (

`id` int unsigned NOT NULL AUTO_INCREMENT,

`a` int unsigned NOT NULL DEFAULT '0',

`b` int unsigned NOT NULL DEFAULT '0',

`c` int unsigned NOT NULL,

`asda` varchar(45) DEFAULT NULL,

PRIMARY KEY (`id`),

KEY `a_b_c_index` (`a`,`b`,`c`)

) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

复制代码

分别执行下面的sql。

explain SELECT * FROM test.test where a=2 and b=12 and c=12;

复制代码

b151c295907a7d32445b3f3a9dd6bcf4.png

根据key_len和key两个字段发现,该sql用到了索引的全部部分。

explain SELECT * FROM test.test where a=2 and b>12 and c=12;

复制代码

18c7a608394938f7401dd0d08602c0c4.png

其中key_len结果是8,说明只用到了,索引的两个部分,但无法确认是abc中的哪些用到了索引。

explain SELECT * FROM test.test where a=2 and b>12;

复制代码

de5835766962896fe825ad50c33bae09.png

其中key_len结果是8,说明a和b都用到了索引。

explain SELECT * FROM test.test where a=2 and c=12;

复制代码

76d4bed7cc244e7c961f4a33c73792a4.png

其中key_len结果是4,发现其中只有一个字段用到了索引。

explain SELECT * FROM test.test where c=12;

复制代码

1dd3d4c24adcb1b6a2ff563109b8263f.png

这里没用到索引。

根据以上的结果,可以得到那个面试题的结论。只会用到 a 和 b部分用到了索引。

3. 总结

对于联合索引最左原则的总结如下:

1.联合索引的最左侧列要在查询语句中才能用到联合索引。

2.查询语句中,存在最左侧连续的字段,且不能有范围查询的联合索引部分会生效。

3.最左原则在遇到范围查询后,之后往右的字段,索引不生效。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值