简述MySQL联合索引最左匹配原则

前言

在网上看过一些有关最左匹配原则的博客,自以为自己理解了,但是今天面试的时候被面试官深挖了一下,就暴露了其实并没有真正理解到最左匹配原则。

最左前缀匹配原则

MySQL在建立联合索引的时候,会从左到右依次建立递增的索引。而且也比较推荐建立联合索引,因为一个索引可以起到很多个索引的作用。

CREATE TABLE `index_test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `a` int(11) DEFAULT NULL,
  `b` int(11) DEFAULT NULL,
  `c` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `index_abc` (`a`,`b`,`c`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

联合索引index_a_b_c实际上相当于建立了三个索引,(a),(a,b),(a,b,c)这么一来,索引是按照a -> b -> c的排序方式形成B+树,可以使用a and b and c依次走a b c 的索引,如果是搜索a and c的话只走了a索引,可以走联合索引的情况有:

# 单个
SELECT * FROM test WHERE a = 1;
# 多个
SELECT * FROM test WHERE a = 1 AND b = 1;
SELECT * FROM test WHERE a = 1 AND b = 1 AND c = 1;
# 注意(a,c)其实也是有索引的
SELECT * FROM test WHERE a = 1 AND c = 1;
# 在SQL解析器看来都一样
SELECT * FROM test WHERE a = 1 AND b = 1;
SELECT * FROM test WHERE b = 1 AND a = 1;

使用联合索引的好处

  • 减少开销:一个(a,b,c)索引就相当于三个索引了(a),(a,b),(a,b,c)。每多增加一个索引,都会增大写操作都开销以及磁盘空间都开销。对于数据量很大的表,使用联合索引可以大大减少开销。
  • 覆盖索引:由于联合索引可以起到多个索引的效果,比如SELECT * FROM test WHERE a = 1 AND b = 1;也是走索引的,走索引就避免了全表扫描,大大增加了查询效率
  • 效率高:走索引的条件越多,通常筛选出来的数据就越少,数据量越少,程序的性能就更高。比如一个条件可以缩小到百分之10的查询范围,1000w的数据量使用三个索引就会有1000w * 10% * 10% * 10% = 1w条的数据。

引申

对于联合索引(a,b,c),查询语句SELECT * FROM test WHERE b = 1,是否能够触发索引?
大多数人都会说NO,实际上确实YES。
使用explain工具查询的时候,经常会看两种索引:

  1. type:index
  2. type:ref

index:这种类型表示mysql会对整个索引进行扫描。这种检索方式的使用条件是,只要是索引,或者搜索的内容是索引的一部分,都可以触发。MySQL会采用扫描整个索引的方式来查询,缺点就是效率不高。
ref:这种类型表示MySQL会根据特定的算法来找到符合条件的数据。而不是对整个索引进行遍历,也就是平常理解对使用索引可以快速找到数据的原因。但是这种检索方式也是有条件的,索引必须符合满足条件的数据结构,也就是说索引必须是有序的,才可以使用这种检索方式。

发布了17 篇原创文章 · 获赞 0 · 访问量 319

猜你喜欢

转载自blog.csdn.net/qq_26375325/article/details/105149232