什么是最左前缀原则?什么是最左匹配原则
-
顾名思义,就是
最左优先
,在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边。
-
最左前缀匹配原则,非常重要的原则,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的顺序可以任意调整
。
-
=和in可以乱序,比如a = 1 and b = 2 and c = 3 建立
(a,b,c)索引可以任意顺序
,
mysql的查询优化器会帮你
优化成索引可以识别的形式
!!!!!
MySQL中使用IN会不会走索引:
MySQL中使用IN会不会走索引 - 左手daima右手诗 - 博客园
结论:IN肯定会走索引,但是当IN的取值范围较大时会导致索引失效,走全表扫描
情况一:全列匹配。
当按照索引中所有列进行精确匹配(这里精确匹配指“=”或“IN”匹配)时,索引可以被用到。这里有一点需要注意,理论上索引对
顺序
是敏感的,但 是由于
MySQL
的
查询
优化器
会自动
调整
where子句的
条件
顺序
以使用适合的索引
情况二:
左
前缀
匹配。
当
查询
条件
精确匹配索引的
左
边连续一个或几个列时,如或,所以可以被用到,但是只能用到一部分,即
条件
所组成的
左
前缀
。上面的
查询
从分析结果看用到了PRIMARY索引,但是 key_len为4,说明只用到了索引的第一列
前缀
。
情况三:
查询
条件
用到了索引中列的精确匹配,但是中间某个
条件
未提供。
此时索引使用情况和情况二
mysql
建立多列索引有最
左
前缀
原则
,即最
左
优先如:
如果建立了一个索引(col1,col2,col3)则对(col1),(col1,col2),(col1,col2,col3)上建立了索引
范围
查询
范围列可以用到索引(必须是最
左
前缀
),但是范围列之后无法用到索引,同时,索引最多用于一个范围列,一次如果
查询
条件
中有两个范围列则无法全用到索引
mysql
会一直向右匹配知道遇到范围
查询
(>,<,between,like)就停止匹配。比如a=1 and b=2 and c >3
首先,需要明确的是:最
左
前缀
原则
是发生在复合索引上的,只有复合索引才会有所谓的
左
和右之分
在
MySQL
建立联合索引时会遵守最
左
前缀
匹配
原则
,即最
左
优先,在检索数据时从联合索引的最
左
边开始匹配
有一个复合索引:INDEX(a, b, c)
使用方式 能否用上索引
select * from users where a = 1 and b = 2 能用上a、b
select * from users where b = 2 and a = 1 能用上a、b(有
MySQL
查询
优化器
)
select.
##3.2 什么情况下可以用到B树索引
(1) 定义有主键的列一定要建立索引 : 主键可以加速定位到表中的某行
(2) 定义有外键的列一定要建立索引 : 外键列通常用于表与表之间的连接,在其上创建索引可以加快表间的连接
(3) 对于经常
查询
的数据列最好建立索引
① 对于需要在指定范围内快速或频繁
查询
的数据列,因为索引已经排序,其指定的范围是连续的,
查询
可以利用索引的排序,加快
查询
的时间
② 经常用在 where子句中的数据列,将索引建立在where子句的
最
左
前缀
匹配
原则
是指where
条件
中在使用到 > < in between like等范围搜索的这个即以前的字段,如果可以与联合索引的前几个一一匹配,就可以使用这个索引。
但是实际操作中我发现即使
顺序
不一致,即使
条件
的这些字段中多了几个不属于联合索引的字段,依旧使用了这个索引。是
mysql
的
查询
优化器
会帮你
优化
成索引可以识别的形式。自己测试的时候还发现了自己的认知有些错误,故特地总结一下。
test表:
test表的索引: (a, b, c)
1、
查询
语句:select * from
最
左
前缀
原则
:顾名思义是最
左
优先,以最
左
边的为起点任何连续的索引都能匹配上。
(1)如果第一个字段是范围
查询
需要单独建一个索引;
(2)在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最
左
边;
当创建(a,b,c)复合索引时,想要索引生效的话,只能使用 a和ab、ac和abc三种组合!
实例:以下是常见的几个
查询
:
mysql
>SELECT `a`,`b`,`c` FROM A WHERE `a`='a1' ; //索引生效
mysql
>SELECT `a`,`b`,`c`
第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
第四,在使用分组和排序子句进行数据检索时,同样可以显著减少
查询
中分组和排序的时间。
第五,通过使用索引,可以在
查询
的过程中,使用
优化
隐藏器,提高系统的性能。
也许会有人要问:增加索引有如此多的优点,为什么不对表中的每一个列创建一个索引呢?因
什么是最
左
匹配
原则
?
最
左
匹配
原则
就是指在联合索引中,如果你的 SQL 语句中用到了联合索引中的最
左
边的索引,那么这条 SQL 语句就可以利用这个联合索引去进行匹配。例如某表现有索引(a,b,c),现在你有如下语句:
select * from t where a=1 and b=1 and c =1; #这样可以利用到定义的索引(a,b,c),用上a,b,c
select.
重点:
mysql
的最
左
匹配
原则
其实是和where后面的
查询
条件
顺序
是没有关系的只和索引的字段
顺序
有关;(这里说的
顺序
是联合索引的
顺序
)
这点网上很多地方都说错了
下面我们来用代码模拟一下问题
这里我们创建一个test01表 表中有 abc 三列的复合索引
CREATE TABLE `test01` (
`id` bigint(25) NOT NULL,
`a` bigint(255) DEFAULT NULL,
`b` bigint(255) DEFAULT NULL,
`c` bigint
MySQL
最
左
匹配
原则
是指,在使用索引的情况下,
MySQL
会优先使用索引的
左
边列进行匹配,如果
左
边列匹配失败,则不会使用其他列进行匹配。
例如,我们有一个名为users的表,其中包含id、name和age三列。如果我们在使用
查询
语句时,使用了以下
条件
:
SELECT * FROM users WHERE name='John' AND age=25;
如果我们在表中创建了一个包含name和age两列的联合索引,则
MySQL
会使用该联合索引进行匹配。但是,由于
MySQL
最
左
匹配
原则
,它会先使用索引的
左
边列name进行匹配,如果匹配成功,则再使用age列进行匹配。如果name列匹配失败,则不会使用age列进行匹配。
因此,如果我们的
查询
条件
是`SELECT * FROM users WHERE age=25 AND name='John'`,
MySQL
也会使用该联合索引进行匹配,因为它仍然可以通过最
左
匹配
原则
使用索引的
左
边列age进行匹配。
使用LambdaQueryWrapper 报错MybatisPlusException: can not find lambda cache for this property [****]
Pod 的 phase 和 conditions 的区别
Swagger 2.0 规范 详解