数据访问路径学习总结(索引分类)
2017-03-19 22:49
274 查看
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不支持索引暗示坑爹了~)
数据访问路径 | 主要特点 | 适用场景 |
---|---|---|
全表扫描 | 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 |
我一般是通过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 |
相关文章推荐
- MongoDB数据模型和索引学习总结
- Yii学习总结之数据访问对象 (DAO)
- Excel VBA 学习总结 - 通用ADO数据访问模型
- Yii学习总结之数据访问对象 (DAO)
- MongoDB数据模型和索引学习总结
- Android学习总结二:五大布局、Android测试、数据存储访问(TextUtils)、Map的使用
- Entity Framework 学习总结之二:数据访问区别
- Excel VBA 学习总结 - 通用ADO数据访问模型
- Entity Framework 学习总结之二:数据访问区别
- Excel VBA 学习总结 - 数据访问方式小结
- asp.net学习总结——ADO.net(对Sql Server进行操作的数据访问类)
- Android学习总结二:五大布局、Android测试、数据存储访问(TextUtils)、Map的使用
- 索引、物化视图-oracle 性能调优之 数据访问路径优化-by小雨
- 学习ASP .NET MVC5官方教程总结(六)通过控制器访问模型的数据
- Entity Framework 学习总结之二:数据访问区别
- 深度学习DeepLearning.ai系列课程学习总结:6. 具有一个隐藏层的平面数据分类代码实战
- [C学习]总结(从数据类型到函数)
- wpf学习笔记-数据绑定功能总结
- wpf学习笔记-数据绑定功能总结
- [C学习]总结(数据类型)