是以我们须要经由过程谓词来肯定索引片的厚度,过滤的值域范围越少,索引片厚度就越窄。那么谓词必定就能匹配到索引么,或者说匹配的规矩是什么?
四、匹配列&过滤列
谓词不必定都能匹配到索引,可以或许匹配上的,我们称之为匹配列。此时它可以介入索引片的定义。
只有匹配列和过滤列可以介入索引片的定义和过滤,其他弗成。
我们来看下谓词匹配的定义:
1、示例
- select * from test where user_name=’test1’ and sex>0 and age =10
发明索引id_name_sex
- 逐行检查其索引列(id,user_name,sex)
- 起首检查 id,发明where后面的谓词没有与之对应,则 这个索引列以及后面的索引列都长短匹配列
- 索引id_name_sex匹配停止,无匹配列
发明索引name_sex_age
- 逐行检查其索引列(user_name,sex,age)
- 起首检查 user_name,发明where后面的 谓词 user_name 有与之对应,认定此列为匹配列
- 检查索引字段sex,发明where后面有谓词sex与之对应,认定此列为匹配列,因为谓词sex是范围谓词,则残剩的索引为非匹配列。
- 索引列age 是在最后一个匹配列sex 之后,而又有谓词age 与之对应,是以此列 为过滤列,
经由过程这个示例,我们最终肯定了:
- 匹配索引: name_sex_age
- 匹配列: user_name,sex
- 过滤列: age
我们查看下 explain ,和我们分析的对应。

2、肯定匹配列有什么竽暌姑
肯定匹配列之后我们可以知道当前的萌芽会用到哪些索引,以及匹配到该索引的哪些列,最终可以提前锁定命据的拜访范围,为数据的攫取节俭攫取压力。
相对于没用匹配到索引的萌芽,有匹配列的萌芽,前提过滤是前置的,而没有匹配到索引的萌芽,前提过滤是后置的,即全表扫描之后,再过滤结不雅,如斯磁盘IO压力过大年夜。
别的 “最左匹配”原则也是基于匹配列规矩而来,为何是最左匹配,除了B树的道理之外,还有一个重要的原因,在查对匹配列的时刻,是大年夜头到尾依次检查索引列。
所以对于是否可以或许匹配到索引,where后面的谓词次序不重要,重要的是索引列的次序。
比如:
- select * from test where user_name=’test1’ and sex>0 and age =10
- select * from test where sex>0 and user_name=’test1’ and age =10
- select * from test where age =10 and user_name='test1' and sex>0
都可以匹配到name_sex_age 索引
- //会匹配到5个数据
- sql1:select * from test where sex=1;
![]()
3、复杂谓词
如不雅值是%xx ,那么将会选择全索引扫描,不介入索引匹配,如不雅是xx%,这会介入索引匹配,选择索引片扫描。
推荐阅读
开辟者大年夜赛路演 | 12月16日,技巧立异,北京不见不散 据外媒报道,宏碁近日推出一款型号为PE320QK Pro的专业显示器,该款显示器屏幕屏幕比例为惯例的16:9设计,大年夜小为31.5英寸,分>>>详细阅读
本文标题:SQL优化器究竟帮你做了哪些工作?
地址:http://www.17bianji.com/lsqh/39807.html
1/2 1



网友点评
精彩导读
科技快报
品牌展示