索引最左前缀原则

简介: 索引最左前缀原则

一个慢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字段。

目录
相关文章
|
7月前
|
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子句顺序以利用合适索引。
55 0
|
4月前
|
索引
【面试题】串联所有单词的子串,找到所有符合条件的串联子串的起始索引
【面试题】串联所有单词的子串,找到所有符合条件的串联子串的起始索引
54 0
|
7月前
|
存储 关系型数据库 MySQL
MySQL索引简介(包含索引优化,索引失效,最左前缀简洁版)
MySQL索引简介(包含索引优化,索引失效,最左前缀简洁版)
106 0
|
7月前
|
Python C++ 机器人
C/C++每日一练(20230419) 插入区间、单词拆分、不同路径
C/C++每日一练(20230419) 插入区间、单词拆分、不同路径
49 0
C/C++每日一练(20230419) 插入区间、单词拆分、不同路径
|
关系型数据库 MySQL 数据库
MySQL数据库-最左前缀法则
如果索引了多列(联合索引),要遵守最左前缀法则。
221 0
|
存储 算法
数组算法:倒置,查找,插入,删除
数组算法:倒置,查找,插入,删除
85 0
|
数据库 索引
左前缀原则
左前缀原则(Left-Prefix Principle)是数据库索引设计中的一个重要原则,它指出在创建索引时,应该优先考虑最常用的查询,并使用最左边的列作为索引的前缀。下面我将详细介绍左前缀原则的定义、作用以及实际应用场景。
207 0
|
SQL 关系型数据库 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. 定义 最左前缀匹配原则:
537 0
Mysql中索引的最左前缀原则图文剖析(全)
|
存储 算法 容器
Leetcode 76最小覆盖子串&77组合&78子集
给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。
121 0
Leetcode 76最小覆盖子串&77组合&78子集