首页 > 代码库 > 索引的使用

索引的使用

物理查询优化
索引
索引是建立在表上的,本质是通过索引直接定位表的物理元组,加快数据获取的方式;索引优化的手段归属于物理查询优化。
如何使用索引
索引是提高查询效率的有效手段。如果某个列上存在索引,并不意味着能够有效使用。
查询优化器使用索引的原则如下:
1. 索引列作为条件出现在where,having,on子句中,这样有利于索引过滤元组。
2. 索引列是被连接的表(内表)对象的列且存在于连接条件中。
还有一些特殊情况可以使用索引,如排序操作,在索引列上求min,max值等。
对表做查询,没有列对象作为过滤条件(如出现在where子句中),只能顺序扫描。
对表做查询,有列对象且索引列作为过滤条件,可做索引扫描。
对表做查询,有列对象作为过滤条件,但索引列被运算符"-"处理,查询优化器不能在执行前进行取反运算,
不可利用索引扫描,只能所顺序扫描。
对表做查询,有列对象作为过滤条件,且目标列没有超出索引列,可做只读索引扫描,这种扫描方式比单纯的索引扫描的效率更高。
对表做查询,有索引存在,单选择条件不包括索引列对象,只能使用顺序扫描。
对表做查询,有索引存在,选择条件包括索引列对象,可使用索引扫描,对选择条件中不存在索引的列作为过滤器被使用。
对表做查询,有索引存在,选择条件包括索引列对象,但索引列对象位于一个表达式,参与了运算,不是"key=常量"格式,则索引不可使用,只能是顺序扫描。
对表做查询,有索引列对象作为过滤条件,操作符是范围操作符>或<,可做索引扫描。
对表做查询,有索引列对象作为过滤条件,操作符是范围操作符<>,不可做索引扫描。
对表做查询,有索引列对象作为过滤条件,操作符是范围操作符between-and,可做索引扫描。

总结:
对于索引列,索引可用的条件如下:
1.在where,join/on,having的条件中出现"key <op>常量"格式的条件子句(索引列不能参与带有变量的表达式的运算)。
2.操作符不能是<>操作符(不等于操作符在任何类型的列上不能使用索引,这个是一个优化规则,在这种情况下,顺序扫描的效果通过好于索引扫描。)
3.索引列的值选择率越低,索引越有效,通常认为选择率小于0.1则索引扫描效果会好一些。

索引列的位置对使用索引的影响
在查询语句中,索引列出现在不同的位置,对索引的使用有着不同的影响。
1.对目标列、where等条件子句的影响
索引列出现在目录列,通常不可使用索引
聚集函数min/max用在索引列上,出现在目标列,可使用索引;min/max聚集函数的优化可以利用索引列进行。
索引列出现在join/on子句中作为连接条件,不可使用索引。
索引列出现在join/on子句中,作为限制条件满足"key<op>常量"格式可用索引。
select a.*,b.* from a join b on (a1=b1) and a.a1=1;
列索引出现在where子句中,但与查询比较,格式上不满足"key<op>常量",不可用索引。

2.对group by子句的影响
索引列出现在group by 子句中,不触发索引扫描。
select a.a1 from a group by a1;
where子句出现索引列且索引列使用符合"key<op>常量"格式,且group by 子句出现索引列,索引扫描被使用。
select a.a1 from a where a1>2 group by a1;
where子句出现非索引列,且group by子句出现索引列,索引扫描不被使用。
3.对having子句的影响
索引列出现在having子句中与出现在where子句中类似,是否能够使用索引,要看具体情况。
where子句中出现非索引列,且group by 和having子句出现索引列,索引扫描被使用。
having子句使用索引列且符合"key<op>常量"格式,可以使用索引。
4.对order by 子句的影响
索引列出现在order by 子句中,可使用索引;order by 操作可以利用索引列完成排序优化。
order by 操作在非索引列的作用下,不可以利用索引列完成排序优化。
5.对distinct的影响
索引列出现在distinct子句范围中,与索引列没有关联。
select distinct a.a1 from a;
索引列出现在distinct子句,因where子句内使用索引列,可以使用索引扫描。

6.联合索引对索引使用的影响
使用联合索引的全部列可以使用索引扫描。
使用联合索引的前缀部分索引,如"key_part_1<op>常量"可触发索引的使用。
使用部分索引键,但不是联合索引的前缀部分,如"key_part_2<op>常量"不可触发索引的使用。
使用联合索引的全部索引键,但索引键不是and操作,不可触发索引的使用。
or操作不会触发索引使用。

7.多个索引对索引使用的影响
where条件子句出现两个可利用的索引,优先选择简单的索引。
where条件子句出现两个可利用的索引且索引键有重叠部分,优先选择最简单的索引。



索引的使用