关于索引的使用模式(r3笔记56天)

索引的使用对于一些庞大的sql语句来说,大多数的调优场景中有种雪中送炭的感觉,如果几百万,几千万的数据筛查,全表扫描将会是一个极度消耗资源的过程,但是如果走了索引扫描,可能性能会提升成百上千倍。索引的访问模式有以下几种,其实有些时候对有些细节还是不太注意。对不同的使用场景可以有一定的针对性,效率也许更高。 可以创建如下的测试表来简单归纳一些。

SQL> create table a as select object_id,object_name,object_type from  dba_objects;
Table created.
SQL> desc a
 Name                                                   Null?    Type
 ----------------------------------------------------- --------  ------------------------------------
 OBJECT_ID                                                       NUMBER
 OBJECT_NAME                                                     VARCHAR2(128)
 OBJECT_TYPE                                                     VARCHAR2(19)
SQL> analyze table a compute statistics;
Table analyzed.
SQL> create unique index ind_a on a(object_id);  --我们创建了唯一性索引
Index  created.
SQL> set autot traceonly exp

查看执行计划,使用了index uniqe scan,这种方式是最快的索引访问模式。

我们只输出索引列的值,结果预想可以走索引扫描,但是结果走了全表扫描,来看看为什么。

我们只需要简单的修改一些列的属性,就可以排除null的干扰,走索引扫描,这个时候走的是快速索引全扫描。这种索引扫描因为不会涉及到排序,所以扫描要快一些。

如果要对索引列作排序,这个时候可以使用索引全扫描,通过下面的执行计划可以看到快速扫描和全扫描的差别。

如果涉及到索引列的区间值,可以使用区间扫描,比如我们常用的between条件就会走区间扫描。

对于跳跃索引扫描,可能会略微难懂一些。 可以举一个简单的例子来模拟一下。我们创建一个表a,然后让一些字段的数据分布倾斜。

SQL>  drop index ind_a;
Index dropped.
SQL> create index ind_a on  a(object_type,object_id,object_name);
Index created.
SQL> analyze table  a compute statistics for all indexed columns;
Table analyzed.
SQL>  select object_id from a where object_type='INDEX PARTITION' and rownum<2;   --我们随便抽取出一条记录来做测试。Object_id为5639
 OBJECT_ID
----------
      5639

可以看到数据的分布情况如下。

这个时候使用object_id来做查询,就会走跳跃索引扫描。尽管索引列是(object_type,object_id,object_name),但是通过object_id能够筛查出很小比例的数据。

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2014-11-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏撸码那些事

MySQL——索引基础

本篇文章,我们将从索引基础开始,介绍什么是索引以及索引的几种类型,然后学习如何创建索引以及索引设计的基本原则。

11130
来自专栏技术博客

Oracle初级索引学习总结

   索引是常见的数据库对象,建立索引的目的是为了提高记录的检索速度。它的设置好坏,使用是否得当,极大地影响数据库应用程序和Database的性能。虽然有许多资...

10520
来自专栏一个爱吃西瓜的程序员

学习SQL【5】-数据更新

数据的更新处理大体可以分为插入(INSERT)、删除(DELETE)和更新(UPDATE)三类,此外,还会给大家介绍数据库中用来管理数据更新的重要概念—事务。 ...

37470
来自专栏JavaQ

MySQL索引实战经验总结

MySQL索引对数据检索的性能至关重要,盲目的增加索引不仅不能带来性能的提升,反而会消耗更多的额外资源,本篇总结了一些MySQL索引实战经验。 索引是用于快速查...

36680
来自专栏Grace development

举枪消灭”烂代码”的实战案例

之前我写过一篇如何少写PHP “烂”代码 https://blog.fastrun.cn/2018/06/13/1-9/ 感觉很多新人对此不太理解。今天以打卡...

9230
来自专栏后端技术探索

一次非常有意思的sql优化经历

发现没有用到索引,type全是ALL,那么首先想到的就是建立一个索引,建立索引的字段当然是在where条件的字段。

8920
来自专栏Java后端生活

MySQL(十)DQL之分页查询

22060
来自专栏程序你好

正确使用索引和Explain工具,MySQL性能提升实例

可以有多种不同层次的技术提高应用程序性能,但是通常我们首先关注的是数据库方面——这是最常见的性能瓶颈。数据库的性能可以改善吗?我们如何衡量,到底什么需要性能改进...

19830
来自专栏潘昌伟的专栏

用好 mysql 分区表

大数据时代,数据量趋于海量,mysql单表很难满足大数据场景的一些统计需求,用好分区表可以很好的解决很大一部分的问题。

2.2K10
来自专栏Java帮帮-微信公众号-技术文章全总结

Java企业面试——数据库

数据库部分 数据表连接问题,左外连接、右外连接、内连接等 一、交叉连接(CROSS JOIN) 交叉连接(CROSS JOIN):有两种,显式的和隐式的,不...

30440

扫码关注云+社区

领取腾讯云代金券