MySQL最左匹配原则
最左匹配原则都是针对联合索引来说的,那么为什么要使用联合索引呢?
一、为什么要使用联合索引?
1、减少开销。
建一个联合索引(col1,col2,col3),实际相当于建了(col1),(col1,col2),(col1,col2,col3)三个索引。每多一个索引,都会增加写操作的开销和磁盘空间的开销。对于大量数据的表,使用联合索引会大大的减少开销!
2、覆盖索引。
对联合索引(col1,col2,col3),如果有如下的SQL: select col1,col2,col3 from test where col1 =1 and col2=2 那么MySQL可以直接通过遍历索引取得数据,而无需回表,这减少了很多的随机io操作。减少io操作,特别的随机io其实是dba主要的优化策略。所以,在真正的实际应用中,覆盖索引是主要的提升性能的优化手段之一。
3、效率高。
索引列越多,通过索引筛选出的数据越少。有1000W条数据的表,有如下SQL: select from table where col1=1 and col2=2 and col3=3,假设假设每个条件可以筛选出10%的数据,如果只有单值索引,那么通过该索引能筛选出1000W*10%=100w条数据,然后再回表从100w条数据中找到符合col2=2 and col3=3的数据,然后再排序,再分页;如果是联合索引,通过索引筛选出1000w*10%*10%*10%=1w,效率提升可想而知!
二、最左前缀匹配原则
对于联合索引,MySQL会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a=1 and b=2 and c>3 and d=4如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。
误区:对于联合索引(a,b),只有where a=1 and b=2可以使用到索引,而where b=2 and a=1无法使用索引。
实际上:where a=1 and b=2 等价于 where b=2 and a=1 ,两个语句都可以使用到联合索引(a,b)。 这是因为MySQL的查询优化器会判断SQL语句以什么样的顺序执行效率最高,当然能尽量利用索引时查询效率最高,所以MySQL查询优化器会以最合理的顺序执行查询。
三、最左匹配原则的原理
我们都知道索引的底层是一颗B+树,那么联合索引当然还是一颗B+树,只不过联合索引的健值数量不是一个,而是多个。构建一颗 B+树只能根据一个值来构建,因此数据库依据联合索引最左的字段来构建B+树。
例子:假如创建一个(a,b,c)的联合索引,那么它的索引树是这样的:

该图就是一个形如(a,b,c)联合索引的b+树,其中的非叶子节点存储的是第一个关键字的索引a,而叶子节点存储的是三个关键字的数据。
这里可以看出a是有序的,而b, c都是无序的。但是当在a相同的时候,b是有序的,b相同的时候,c又是有序的。
通过对联合索引的结构的了解,那么就可以很好的了解为什么最左匹配原则中如果遇到范围查询就会停止了。以select * from t where a=5 and b>0 and c=1; 这样a,b可以用到(a,b,c),c不可以,当查询到b的值以后(这是一个范围值),c是无序的。所以就不能根据联合索引来确定到底该取哪一行。
联合索引就是按照第一列进行排序,然后第一列排好序的基础上再对第二列进行排序,以此类推。如果没有第一列直接访问第二列,第二列肯定是无序的,直接访问后面的列就用不到索引了。
MySQL最左匹配原则的更多相关文章
- Mysql最左匹配原则实践(原创)
mysql最左匹配原则 什么叫最左匹配原则 最左匹配原则的误区 实战 结论: 1 条件查询中条件顺序没有关系 2 在最左匹配原则中,有如下说明: 最左前缀匹配原则,非常重要的原则,mysql会一直向右 ...
- MYSQL 最左匹配原则的原理
https://blog.csdn.net/Andrew_Chenwq/article/details/125242197最左匹配原则最左匹配原则就是指在联合索引中,如果你的 SQL 语句中用到了联合 ...
- MySql最左匹配原则解析
看前提问:table中有多个字段组成的联合索引(a,b,c),查询时哪些情况能够命中索引呢? 话不多说,直接开搞: 数据库表结构如下: CREATE TABLE `test` ( `id` ) uns ...
- Mysql索引最左匹配原则
先来看个例子: 1. 示例1:假设有如下的一张表: DROP TABLE IF EXISTS testTable; CREATE TABLE testTable ( ID BIGINT NOT NUL ...
- Mysql中联合索引的最左匹配原则
在Mysql建立多列索引(联合索引)有最左前缀的原则,即最左优先. 如果我们建立了一个2列的联合索引(col1,col2),实际上已经建立了两个联合索引(col1).(col1,col2); 如果有一 ...
- MySQL组合索引最左匹配原则
几个重要的概念 1.对于mysql来说,一条sql中,一个表无论其蕴含的索引有多少,但是有且只用一条. 2.对于多列索引来说(a,b,c)其相当于3个索引(a),(a,b),(a,b,c)3个索引,又 ...
- Mysql中联合索引的最左匹配原则(百度)
创建联合索引时列的选择原则 经常用的列优先(最左匹配原则) 离散度高的列优先(离散度高原则) 宽度小的列优先(最少空间原则) 在Mysql建立多列索引(联合索引)有最左前缀的原则,即最左优先.如果我们 ...
- 3.联合索引、覆盖索引及最左匹配原则|MySQL索引学习
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 导语 在数据检索的过程中,经常会有多个列的匹配需求,今天介绍下联合索引的使用以及最左匹配原则的案例. 最左匹配原则作用在联 ...
- MySQL 索引失效-模糊查询,最左匹配原则,OR条件等。
索引失效 介绍 索引失效就是我们明明在查询时的条件为索引列(包括自己新建的索引),但是索引不能起效,走的是全表扫描.explain 后可查看type=ALL. 这是为什么呢? 首先介绍有以下几种情况索 ...
- mySql 数据库设计原则
mysql数据库设计原则: 必须使用InnoDB存储引擎 解读:支持事务.行级锁.并发性能更好.CPU及内存缓存页优化使得资源利用率更高 禁止使用存储过程.视图.触发器.Event 解读:高并发大数据 ...
随机推荐
- Go 汇编学习笔记
0.前言 学习 Go 离不开看源码,源码又包含大量汇编代码,离开汇编是学不好 Go 的.同样,离开汇编去学习计算机是不完整的,汇编是基石,是离操作系统和硬件最近的一层. 虽然之前学过一点 Go 汇编, ...
- 小白学标准库之反射 reflect
1. 反射简介 反射是 元编程 概念下的一种形式,它在运行时操作不同类型的对象,检查对象的类型,大小等信息,对于没有源代码的包反射尤其有用. 设想一个场景,读取一个包中变量 a 的类型,并打印该类型的 ...
- 关于《 MultipartFile 的 file.transferTo 》 的坑
错误原因: Controller只能接收一次 MultipartFile的文件, 如果再将接收的 MultipartFile文件 传递给 其他的service , 那么其他的 service 则获取不 ...
- Laravel - 虚拟主机引入静态资源
一. 注意: 引用的静态文件要放在根目录,不要放在assets目录下 二. 引入方法 1. 模板中引入 css <link rel="stylesheet" hr ...
- Java基础篇(05):函数式编程概念和应用
目录 一.函数式概念 二.函数与方法 三.JDK函数基础 1.Lambda表达式 2.函数式接口 四.Optional类 1.Null判断 2.Optional应用 五.Stream流 一.函数式概念 ...
- [转帖]07、kvm虚拟机的克隆
操作前先关闭虚拟机 虚拟机的克隆 一.命令行克隆virt-clone(方法一) virt-clone -o vm1 -n vm2 -f /kvmdata/vm2.img 参数说明: -o:指定需要被c ...
- [转帖]rclone将本地文件或文件夹导入minio中
1.背景:公司数据迁移涉及到文件迁移,原有文件服务器没有使用minio,但是现在的新系统使用了minio.所以这就需要我们将文件上传到minio文件服务器中:由于历史文件数据量大,甲方要求可以通过服务 ...
- Redis命令监控与简单分析
Redis命令监控与简单分析 前言 为了能够快速识别分析redis的命令 自己在环境上面进行了一些简单的跟踪以及脚本 这里不全是进行metrics, 细致到具体的命令分析 脚本部分-1 mkdir - ...
- 自建邮箱服务器 EwoMail 发送邮件的办法
总结来源: http://doc.ewomail.com/docs/ewomail/changguipeizhi 1. 首先这个机器不能安装dovecot等软件,不然安装脚本会失败. 2. 下载安装文 ...
- axios文件上传和 Content-Type类型介绍
Content-Type的作用是什么? Content-Type: 用于在请求头部指定资源的类型和字符编码. 请求头中的content-type,就是 B端发给S端的数据类型描述 . 即告诉服务器端, ...