您的位置:首页 > 其它

数据访问路径学习总结(索引分类)

2017-03-19 22:49 274 查看
1.表格呈现
数据访问路径主要特点适用场景
全表扫描1.扫描表的所有数据块,包括空块

2.支持多块读

1.需要访问超过5%的数据

2.一般是后台任务,前台业务一般要避免对大表做全表扫描

索引唯一扫描1.一次扫描的块非常少

2.它是索引范围扫描的特例

3.最多查出一条数据

1.根据主键或唯一索引精确查询

2.优先使用的方式

索引范围扫描1.最常用的索引扫描方式

2.性能最好跟索引唯一扫描一样

           最差跟索引全扫描一样

适合在索引中命中少量数据的场景,不超过5%的数据总量
索引全扫描1.索引范围扫描的特例

2.索引返回结果是有序的

1.一般不建议使用

2.在排序后查top n的场景下可以使用

索引快速全扫描1.索引返回结果是无序的

2.性能优于全表扫描

3.支持多块读,优于全索引扫描

1.只需要访问索引,无序访问表

2.作为全表扫描的替代方式使用

3.CBO可使用,RBO不可以

索引跳跃扫描1.组合索引查询时,查询条件没有使用前导列

2.等价于遍历前导列的所有取值分别做索引范围扫描

1.一般不建议使用

2.前导列的取值很少时可以使用

3.CBO可以使用,RBO不可以1

2.SQL效率分析方法:

    我一般是通过explain+SQL语句来分析,可以看到该条SQL语句执行时候的情况包括走没走索引,索引方式是啥等。(此处引申出explain使用及SQL分析,后边有时间整理)

3.文字说明:

    全表扫描:查询某张表中全部或者符合某些规则的数据,不走任何索引的方式,

        即:1.查询没有where条件;2.where条件中的列没有索引

    索引唯一扫描:查询条件的列上有索引,且对该列的的取值唯一如where colName='xxx'

    索引范围扫描:查询条件的列上有索引,且对该列的取值限制用到了大于、大于等于、小于、小于等于

    索引全扫描:扫描索引中所有叶子节点。是索引范围扫描的最差情况,一般避免使用。

        用处/优点:1.查询结果是有序的,当需要对大数据量的表排序时,可以使用索引全扫描,以避免在内存中排序性能差

                             2.查询列无空值,且索引数据就是查询列数据。(是指:select count(1) from tbl  VS  select(colWithIndex) from tbl)

                             3.查询排序的TOP N时,性能可能会比较好,因为扫描到N条数据就可以返回。(仅限条件有且只有索引所在列,如果加一个条件在其他列,性能会比之前查)

        缺点:1.不适用于查询列有空值场景

                    2.性能可能非常差,可能比全表扫描要查。因为访问索引读的数据块比全表扫描要多,造成IO消耗过多(此处引申出“根据CPU/IO/内存消耗情况大致确定SQL性能 瓶颈”)

    索引快速全扫描:应用场景是在只需要访问索引就能获得结果的情况下替代全表扫描使用。提示是index_ffs。

    索引跳跃式扫描:应用场景是索引前导列(一般第一列)的取值很少的情况。索引跳跃扫描也可能优于索引范围扫描。

        适用于所有类型的B+树索引,它使那些在where条件中没有对目标索引的前导列指定查询条件但同时又对该索引的非前导列指定了查询条件的目标SQL依然可以用上该索引。

       提示:index_ss。

        栗子:第一种查询跟第二种查询效率相当,但第三种查询效率较地下。分析一下组合索引的结构更好理解~~~(此处引申出B+树索引的结构,还有是MySQL不支持索引暗示坑爹了~)

表结构如下
create table mytbl
(
    colName1 int,
    colName2 int
)
百万条数据,colName1只有1、2、3三个值
索引如下
create index myindex
on mytbl(colName1,colName2)

第一个查询
select /*+index_ss(mytbl myindex)*/
from mytbl
where colName2=100;

第二个查询
select /*+index(mytbl myindex)*/
from mytbl
where colName1 in (1,2,3) and colName2=100;

第三个查询
select /*+index(mytbl myindex)*/
from  mytbl
where colName1>=1 and colName2=100

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: