首页 > 分享 > where 1=1会影响索引吗

where 1=1会影响索引吗

最新推荐文章于 2024-11-06 09:05:38 发布

weixin_39808877 于 2021-01-26 14:28:48 发布

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

前言

写这篇文章源自一位杠精同事提了个问题,左侧原则跟where条件顺序有无关系?我想了想,好像是有关系的!不敢确定,但是自己又懒得动手测试,于是发起ETC自动抬杠功能,强行杠了一拨,结果杠输了,接下来即是动手验证..

预习执行计划

8e092d357acb47cc858d9cac83d4e615.png

eb66867dada87e3c5877dda59a36a6fb.png

实践

咱们先申明前置条件,创建表如下:

77ed47c42913533b189ca004ee98195f.png

创建复合索引如下注意哦,索引使用的BTree:

d6287262099ff50b64de182f61633e29.png

我们先来一个提问,看如下两条sql,我们花5秒时间思考下,会走索引吗?

sql-1 根据code查询:

d2d1f7572587ab9a4d358b328d5dcd02.png

sql-2 根据name查询:

203811e78bd75bd7ad75e805cfd0d7bf.png

54321

时间到,咱们看下实际结果.

sql-1 执行计划: sql-2 执行计划:

怎麽~样,是否跟你们想象的一样呢?我们继续验证查询条件的顺序是否影响sql的执行计划. 为了方便截图,以下我主要使用SecureCRT查询.

e640ec2074e22cbcbd66497fb8177dc4.png

我们列举以上五条sql来验证,查询结果如下:

13ecd4ddc6b747e25e5b94f73f91f379.png

从上图很明显可以看出,where条件的顺序完全不影响索引的执行,但是很明显上面5条sql所有查询条件都是包含在复合索引内,那要是有查询条件不再符合索引内又是什么结果呢,我们列举4条sql继续求证...

11e4817b582cfc3d8eebe7b9df00eeaf.png

5da2c1265eec3e6dc97796e06094bb08.png

这里发现不一样了,我们的复合索引顺序是name,code,createTime.

当出现非索引字段的查询条件时,只有包含了name的查询条件走了索引.这是为什么呢?

原来是因为我们用了B+树索引数据结构,它是按照从左到右的顺序建立索引,同时mysql查询优化器会优化sql语句,不管where条件顺序如何变化,都会按照索引左侧原则去优化(注意咯是按照索引的左侧,不是where条件的左侧条件哦),以效率最高的方式去执行sql.

好了,到了这里,问题已经解决.不知道童鞋们有没有疑问,上面我们一直说的是BTree索引数据结构,假如是hash结构呢?结果又会是怎样?哈哈哈,不用猜啦,我全部都试过一遍,结果与上面完全一致!

似乎我的分享也该结束了!不,我要加班!哦不对!我热爱学习,热爱加班!继续整理干货!

总结

对于复合索引 idx_A_B_C

有A、A and B、B and A、C and A、A and C、A and B and C、B and A and C、C and B and A 会走索引.

注意: or 不走索引 C and B or A 或者 A and B or C 或者 A and (B or C) 不走索引.

喜欢的话记得点个赞或者加个关注哟.

相关知识

SQL 语句中 where 条件后 写上 1=1 是什么意思!
MySQL优化之索引优化
什么是聚集索引,什么是非聚集索引,什么又是主键?
mysql创建索引的原则 mysql创建索引的语法
MySQL优化系列(三)
Mysql重点知识
MySQL优化笔记(三)
激活python venv 激活银行卡需要带什么
【转】SQL语言艺术
利用Python进行数据分析(5) NumPy基础: ndarray索引和切片

网址: where 1=1会影响索引吗 https://m.huajiangbk.com/newsview1253717.html

所属分类:花卉
上一篇: 棉花种植技术病虫害防治
下一篇: 下列有关说法错误的是A. 粉花植