• 索引的使用


    物理查询优化
    索引
    索引是建立在表上的,本质是通过索引直接定位表的物理元组,加快数据获取的方式;索引优化的手段归属于物理查询优化。
    如何使用索引
    索引是提高查询效率的有效手段。如果某个列上存在索引,并不意味着能够有效使用。
    查询优化器使用索引的原则如下:
    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条件子句出现两个可利用的索引且索引键有重叠部分,优先选择最简单的索引。



  • 相关阅读:
    Linux Netcat命令
    clang-format
    keytool
    ip
    Linux iptables
    Linux yum源完全配置
    Makefile
    CMake
    HSTS
    开源镜像
  • 原文地址:https://www.cnblogs.com/songyuejie/p/6821372.html
Copyright © 2020-2023  润新知