前言

   索引是常见的数据库对象,建立索引的目的是为了提高记录的检索速度。它的设置好坏,使用是否得当,极大地影响数据库应用程序和Database的性能。虽然有许多资料讲索引的用法,DBA和Developer们也经常与它打交道,但还是有不少的人对它存在误解,比如我本人就不是很清楚这其中的道理。所以特此进行总结,也请大牛们来给检查检查,分享下你们的经验。

什么情况下会使用到索引

  一般来说,对于单列索引,只要Select、Delete、Update语句的Where条件中有此列,就会使用此索引。

  对于多列索引,假如一个表中的主键(ID,Name,Age三个字段联合索引),只有当Where条件中包含索引中的前一个或几个列时才会用到索引。

  如ID条件,ID、Age组合条件,ID、Name、Age组合条件,而仅有Name、Age条件,没有ID条件是不会使用索引的。因为此索引是先根据ID排序,ID相同的再根据Name排序,ID、Name相同的再根据Age排序。

什么情况下应该为表建立索引

  一般来说,满足下列条件的应该建立索引:

  1、列经常被用在Where条件中或连接条件中

  2、列的数据比较分散,即重复值不多

  3、列包含大量的空值

  4、几个列经常一起用在Where条件或连接条件中(联合索引)

  5、大部分的检索只返回大表中的小部分记录(2%~5%)

什么情况下不应该为表建立索引

  不应该建立索引的情况有:

  1、表的数据量不大

  2、列很少用在查询条件中

  3、大部分的检索都返回大量的数据  

  4、表的Update操作很频繁

但索引并非总是最佳选择,如果发现Oracle在有索引的情况下,没有使用索引,这并不是优化器出错。在有些情况下,Oracle确实会选择全表扫描(Full Table Scan),而非索引扫描(Index Scan)。这些情况通常有:
  1、表未做统计,或者统计陈旧,导致Oracle判断失误。
  2、根据该表拥有的记录数和数据块数,实际上全表扫描要比索引扫描更快。

但是,Oracle是否真正使用索引,使用索引是否真正有效,还是必须进行实地的测验。合理的做法是,对缩写的复杂sql,在将它写入应用程序之前,先在产品数据库上做一次执行计划(explain)。explain会获得Oracle对该sql的解析(plan),可以明确地看到Oracle是如何优化该sql的。

如果经常做explain,就会发现,喜爱写发扎的sql并不是好习惯,因为过分复杂的sql其解析计划往往不尽如人意。事实上,如果库表结构设计的合理,一般情况下我们很少需要写复杂的sql。将复杂的Sql拆开,有时候会极大地提高效率,因为能获得很好的优化。

用索引提高效率

  通常情况下,通过索引查询数据比全表扫描要快。同样在联结多个表时使用索引也可以提高效率。另一个使用索引的好处是,它提供了主键(primary key)的唯一性验证。不过使用索引时也必须注意到它的代价。索引需要空间来存储,也需要定期维护,每当有记录在表中增减或索引列被修改时,索引本身也会被修改。这意味着每条记录的Insert、Delete、Update将为此多付出4、5此的磁盘I/O。因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢。

  Oracle对索引有两种访问模式:

  索引唯一扫描(Index Unique Scan)

  索引范围查询(Index Range Scan)

  适用于两种情况:1、基于一个范围的检索  2、基于非唯一性索引的检索

  当where子句中有多个索引列,且包含非“=”号时,Oracle会放弃使用非“=”号的索引

  当where子句中有多个索引列,且都为非“=”号时,Oracle将只使用一个索引,至于使用那个索引,这个还要看情况而定。

强制索引失效

  如果两个或以上具有相同的等级,而我们只想使用其中的一个(通过它,检索出的记录数量少),我们可以使用下面的方法:

select Ename from EMP
where ENo=7935
and DNo=10
and EType='A'

如果我们只想用到ENo上的索引(相对另外两个条件记录数量很少,做合并不划算)则可改编为:

select EName from EMP

where ENo=7935

and DNo+0=10   /*DNo上的索引将不会使用/*

and EType|| ''='A'  /*EType上的索引将不会使用/*

同样,如果我们想使用某个列上的索引,则不能对此列做运算。

select * from DEPT

where SAL*12>25000

不能使用SAL列上的索引,可改编为:

select * from DEPT

where SAL>25000/12

总结

  对Oracle的索引了解还不是很深入,只是浮于表面的认识,日后要多加使用研究。

Oracle初级索引学习总结的更多相关文章

  1. oracle唯一索引与普通索引的区别和联系以及using index用法

    oracle唯一索引与普通索引的区别和联系 区别:唯一索引unique index和一般索引normal index最大的差异是在索引列上增加一层唯一约束.添加唯一索引的数据列可以为空,但是只要尊在数 ...

  2. MySQL中的联合索引学习教程

    MySQL中的联合索引学习教程 这篇文章主要介绍了MySQL中的联合索引学习教程,其中谈到了联合索引对排序的优化等知识点,需要的朋友可以参考下   联合索引又叫复合索引.对于复合索引:Mysql从左到 ...

  3. Oracle教程之学习笔记

    Oracle教程之学习笔记... ----------------------------------- Oracle教程:---学习笔记: ============================= ...

  4. 数据库之Oracle——初级

    世上岂无千里马,人中难得九方皋: 酒船鱼网归来是,花落故溪深一篙. 关于数据库的第一篇博客,这是我的第二次,人生第二春,什么也不想说,静静的开始吧,至于为什么写唐诗,请看第一篇文章! Oracle 初 ...

  5. Oracle索引梳理系列(七)- Oracle唯一索引、普通索引及约束的关系

    版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...

  6. SQL索引学习-聚集索引

    这篇接着我们的索引学习系列,这次主要来分享一些有关聚集索引的问题.上一篇SQL索引学习-索引结构主要是从一些基础概念上给大家分享了我的理解,没有实例,有朋友就提到了聚集索引的问题,这里列出来一下: 其 ...

  7. oracle建索引的可选项

    oracle中建索引可能大家都会,但是建索引是有几个选项参数却很少有人关注,在某些特殊环境下,可能会非常有用,下面一一说明: 1.NOSORT,记录排序可选项. 默认情况下,在表中创建索引的时候,会对 ...

  8. oracle 创建索引思考(转)

    在Oracle数据库中,创建索引虽然比较简单.但是要合理的创建索引则比较困难了. 笔者认为,在创建索引时要做到三个适当,即在适当的表上.适当的列上创建适当数量的索引.虽然这可以通过一句话来概括优化的索 ...

  9. Oracle 重建索引脚本

    该指数是一个有力的武器,以提高数据库的查询性能. 没有索引,喜欢同样的标签库没有书籍,找书,他们想预订比登天还难.中,尤其是在批量的DML的情形下会产生对应的碎片.以及B树高度会发生对应变化.因此能够 ...

随机推荐

  1. scanf 输入加逗号(或者不加逗号)出现的异常及解决方案

    我们在写 C 语言代码通常 scanf 的格式控制部分都有两种习惯,加逗号与不加逗号,而这两种情况都会因为我们的不同输入习惯产生一定的问题,这里给出另一种方法. 1.不加逗号 #include< ...

  2. JavaScript中的普通函数与构造函数

    问题 什么是构造函数? 构造函数与普通函数区别是什么? 用new关键字的时候到底做了什么? 构造函数有返回值怎么办? 构造函数能当普通函数调用吗? 以下是我的一些理解,理解错误的地方恳请大家帮忙指正, ...

  3. linux上jenkins连接windows并执行exe文件

    1.如果要通过ssh的方式来连接windows的话,首先需要在windows上安装freesshd来配置启动.配置ssh(win10上自带了openssh可以进行安装使用,但我机器装不上) 1.1.下 ...

  4. 010.KVM虚机冷迁移

    一 实验环境 原虚机名称:vm01-centos6.8 原虚机所在宿主机:kvm-host-2 迁移后虚机名称:vm01-cloud-centos6.8 迁移后虚机所在宿主机:kvm-host-2 二 ...

  5. Eth-Trunk链路聚合配置

    Eth-Trunk概述 Eth-Trunk接口能够实现负载分担.增加带宽和提高可靠性 Eth-Trunk接口把多个物理接口捆绑成一个逻辑接口 Eth-Trunk接口的链路聚合模式 链路聚合模式 应用场 ...

  6. django-模板初探

    一般而言,我们在视图函数中处理各种业务逻辑之后,应该返回一个 HttpResponse 对象.而 HttpResponse 对象的第一个参数接受字符串或者是迭代器,作为响应报文的主体.但是这意味着我们 ...

  7. zookeeper 节点启动时的更新机制

    使用zk的应用节点和zk数据本身的同步,当系统启动时使用zk配置的信息和zk本身存储不一致, 此时应存在一个更新机制将应用配置数据和zk数据更新一致. 启动时更新拉取zk配置中心的更新本地数据,以zk ...

  8. 【WIN10】WIN2D——繪製文字

    先看下截圖: 做了幾個效果:普通.倒影.陰影.歌詞. 普通效果代碼: private void normal_Draw(Microsoft.Graphics.Canvas.UI.Xaml.Canvas ...

  9. 為你的文件夾添加“使用CMD命令打開”菜單

    最近在項目中,經常使用要使用一些python命令,要打開cmd窗口,再pushd或cd切換到某個文件夾,相當麻煩.於是想,何不在“文件夾”中添加右鍵“pushd”命令呢? 有了目的性,一切似乎就變得簡 ...

  10. 【Hadoop】HDFS - 创建文件流程详解

    1.本文目的 通过解析客户端创建文件流程,认知hadoop的HDFS系统的一些功能和概念. 2.主要概念 2.1 NameNode(NN): HDFS系统核心组件,负责分布式文件系统的名字空间管理.I ...