索引最左前缀原则

简介: 索引最左前缀原则

一个慢SQL优化

今天在观察慢sql统计的时候,发现了一个sql的平均耗时长,而且总的扫描行数大,分析对应表的DDL,发现此表中只有一个唯一索引index1(a,b,c),但是在查询条件中没有带上a字段,导致这个查询sql没有走索引,从而导致了全表扫描。这里涉及到一个索引最左前缀原则,我们来一起看一下。

联合索引的最左前缀原则

下述摘自https://blog.csdn.net/zzx125/article/details/79678770

通常我们在建立联合索引的时候,也就是对多个字段建立索引,mysql都会让我们选择索引的顺序,比如我们想在a,b,c三个字段上建立一个联合索引,我们可以选择自己想要的优先级,a、b、c,或者是b、a、c 或者是c、a、b等顺序。为什么数据库会让我们选择字段的顺序呢?不都是三个字段的联合索引么?这里就引出了数据库索引的最左前缀原理。

mysql建立多列索引(联合索引)有最左前缀的原则,即最左优先,如:

  • 如果有一个2列的索引(col1,col2),则已经对(col1)、(col1,col2)上建立了索引;
  • 如果有一个3列索引(col1,col2,col3),则已经对(col1)、(col1,col2)、(col1,col2,col3)上建立了索引;

比如:索引index1:(a,b,c)有三个字段,我们在使用sql语句来查询的时候,会发现很多情况下不按照我们想象的来走索引。

select * from table where c = '1' 这个sql语句是不会走index1索引的,select * from table where b =‘1’ and c ='2' 这个语句也不会走index1索引。

什么语句会走index1索引呢?

答案是:

select * from table where a = '1'

select * from table where a = '1' and b = ‘2’

select * from table where a = '1' and b = ‘2’ and c='3'

我们可以发现一个共同点,就是所有走索引index1的sql语句的查询条件里面都带有a字段,那么问题来了,index1的索引的最左边的列字段是a,是不是查询条件中包含a就会走索引呢?

select * from table where a = '1' and c= ‘2’这个sql语句了。

这也是最左前缀原理的一部分,索引index1:(a,b,c),只会走a、a,b、a,b,c 三种类型的查询,其实这里说的有一点问题,a,c也走,但是只走a字段索引,不会走c字段。

目录
相关文章
|
2月前
|
SQL 关系型数据库 MySQL
13. 知道什么是左前缀原则嘛 ?
MySQL的联合索引遵循左前缀原则,检索时从索引的最左侧字段开始匹配。例如,对`age`, `name`, `sex`创建的组合索引`index_age_name_sex`,相当于建立了`(age)`, `(age,name)`, `(age,name,sex)`三个独立索引。查询时,只有包含最左边字段的条件才会使用索引。例如:`WHERE age=49`和`WHERE age=49 AND name='Alice'`会使用索引,但`WHERE sex='man'`不会。查询优化器会自动调整WHERE子句顺序以利用合适索引。
22 0
|
2月前
|
SQL 存储 关系型数据库
✅什么是最左前缀匹配?为什么要遵守?
MySQL 的最左前缀匹配原则是指查询时利用索引的最左边列进行匹配。如果创建了组合索引 (col1, col2, col3),查询条件包括 col1、(col1, col2) 或全列时,MySQL 可以高效利用索引。反之,如果条件仅涉及 col2、col3 或 (col2, col3),则通常无法利用该索引。虽然查询条件顺序可变,但不涉及最左列时,无法使用索引。MySQL 8.0 引入了索引跳跃扫描,允许在某些情况下不遵循最左前缀匹配,提高查询效率。然而,是否使用取决于优化器的成本估算,并受特定条件限制。设计索引时,仍应优先考虑高区分度的字段。
✅什么是最左前缀匹配?为什么要遵守?
|
2月前
|
存储 关系型数据库 MySQL
MySQL索引简介(包含索引优化,索引失效,最左前缀简洁版)
MySQL索引简介(包含索引优化,索引失效,最左前缀简洁版)
40 0
|
关系型数据库 MySQL 数据库
MySQL数据库-最左前缀法则
如果索引了多列(联合索引),要遵守最左前缀法则。
180 0
|
12月前
|
数据库 索引
左前缀原则
左前缀原则(Left-Prefix Principle)是数据库索引设计中的一个重要原则,它指出在创建索引时,应该优先考虑最常用的查询,并使用最左边的列作为索引的前缀。下面我将详细介绍左前缀原则的定义、作用以及实际应用场景。
89 0
|
SQL 关系型数据库 MySQL
复合索引最左特性
复合索引最左特性
|
存储 SQL 关系型数据库
MySql索引详解-各种索引的定义与区别和应用
什么是索引?索引的作用,有无索引的区别。
163 0
MySql索引详解-各种索引的定义与区别和应用
|
SQL 关系型数据库 MySQL
Mysql中索引的最左前缀原则图文剖析(全)
目录前言1. 定义2. 全索引顺序3. 部分索引顺序3.1 正序3.2 乱序4. 模糊索引5. 范围索引 前言 之所以有这个最左前缀索引 归根结底是mysql的数据库结构 B+树 在实际问题中 比如 索引index (a,b,c)有三个字段, 使用查询语句select * from table where c = '1' ,sql语句不会走index索引的 select * from table where b =‘1’ and c ='2' 这个语句也不会走index索引 1. 定义 最左前缀匹配原则:
284 0
Mysql中索引的最左前缀原则图文剖析(全)
|
SQL 关系型数据库 MySQL
十七、复合索引最左特性
十七、复合索引最左特性
51 0
LDUOJ——前缀(字典树的链表优化)
LDUOJ——前缀(字典树的链表优化)
76 0