MySQL索引优化系列:索引全用及最左法则

Posted 菜菜bu菜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL索引优化系列:索引全用及最左法则相关的知识,希望对你有一定的参考价值。


mysql索引优化系列:(二)索引全用及最左法则


优化MySQL的性能,主要从索引方面优化,本篇就主要讲解复合索引全用及最左前缀法则来对MySQL进行优化。

复合索引全用

第一篇MySQL索引优化系列:(一)索引的类型里面有说过复合索引是什么,也就是对表上的多个列进行索引复合索引全用的意思就是对于建立的复合索引中包含了几个字段,查询的时候最好能全部用到,而且严格按照索引顺序,这样查询效率是最高的。当然实际使用中要按照具体情况来分析,以上只是说一个理想状况。

下面来实际操作一下:

SQL脚本:

CREATE TABLE `people` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(10) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `sex` char(4) DEFAULT NULL,
  `class` varchar(10) DEFAULT NULL,
  `birthday` date DEFAULT NULL,
  PRIMARY KEY (`Id`),
  KEY `idx_name_age_sex_class` (`name`,`age`,`sex`,`class`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1026 DEFAULT CHARSET=utf8;

然后插入了1024条

INSERT INTO `test`.`people` (`name`, `age`, `sex`, `class`, `birthday`) VALUES ('张三', '17', '男', '1', '2021-03-02');

和1条

INSERT INTO `test`.`people` ( `name`, `age`, `sex`, `class`, `birthday`) VALUES ('李四', '25', '女', '2', '2021-02-24');

不同的查询条件对比:

EXPLAIN SELECT * from people where name="李四"

=>查询时间:0.027s key_len :33

EXPLAIN SELECT * from people where name="李四" and age="25"

=>查询时间:0.026s key_len :38

EXPLAIN SELECT * from people where name="李四" and age="25" and sex="女" 


=>查询时间:0.024s key_len :51

EXPLAIN SELECT * from people where name="李四" and age="25" and sex="女" and class="2"


=>查询时间:0.023s key_len :84

最左前缀法则

最左前缀也跟复合索引有关,索引的顺序要按照建立时的顺序来进行索引,不然就不会使用创立的复合索引。就是从左到右的顺序来写sqlu、语句。

还是以上面的例子来说:

EXPLAIN SELECT * from people where name="李四" and age="25" and sex="女" and class="2"

假如我们改成以下的方式来查询,来看下还会不会使用创造的复合索引

EXPLAIN SELECT * from people where age="25" and sex="女" and class="2"
EXPLAIN SELECT * from people where sex="女" 
EXPLAIN SELECT * from people where  class="2" and name="张三" and class="1"
EXPLAIN SELECT * from people where name="张三" and sex="女" and class="2"
EXPLAIN SELECT * from people where  class="2" and name="张三" and sex="女"

答案是第1、第2、第3不会,第4、第5会。

来看下1、2、3:


再看下4、5:


我们可以看出来推导出最左前缀法则就是:带头大哥不准死、中间兄弟不可断

以上就是今天的分享,如有错误,请大佬们多多包涵,多多指正!谢谢~

以上是关于MySQL索引优化系列:索引全用及最左法则的主要内容,如果未能解决你的问题,请参考以下文章

MySQL中的联合索引覆盖索引及最左匹配原则

联合索引覆盖索引及最左匹配原则|MySQL索引学习

MySQL索引背后的数据结构及最左原则

云上MongoDB常见索引问题及最优索引规则大全

Mysql之索引优化

MySQL之SQL优化详解