前言
索引是常见的数据库对象,建立索引的目的是为了提高记录的检索速度。它的设置好坏,使用是否得当,极大地影响数据库应用程序和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初级索引学习总结的更多相关文章
-
oracle唯一索引与普通索引的区别和联系以及using index用法
oracle唯一索引与普通索引的区别和联系 区别:唯一索引unique index和一般索引normal index最大的差异是在索引列上增加一层唯一约束.添加唯一索引的数据列可以为空,但是只要尊在数 ...
-
MySQL中的联合索引学习教程
MySQL中的联合索引学习教程 这篇文章主要介绍了MySQL中的联合索引学习教程,其中谈到了联合索引对排序的优化等知识点,需要的朋友可以参考下 联合索引又叫复合索引.对于复合索引:Mysql从左到 ...
-
Oracle教程之学习笔记
Oracle教程之学习笔记... ----------------------------------- Oracle教程:---学习笔记: ============================= ...
-
数据库之Oracle——初级
世上岂无千里马,人中难得九方皋: 酒船鱼网归来是,花落故溪深一篙. 关于数据库的第一篇博客,这是我的第二次,人生第二春,什么也不想说,静静的开始吧,至于为什么写唐诗,请看第一篇文章! Oracle 初 ...
-
Oracle索引梳理系列(七)- Oracle唯一索引、普通索引及约束的关系
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
-
SQL索引学习-聚集索引
这篇接着我们的索引学习系列,这次主要来分享一些有关聚集索引的问题.上一篇SQL索引学习-索引结构主要是从一些基础概念上给大家分享了我的理解,没有实例,有朋友就提到了聚集索引的问题,这里列出来一下: 其 ...
-
oracle建索引的可选项
oracle中建索引可能大家都会,但是建索引是有几个选项参数却很少有人关注,在某些特殊环境下,可能会非常有用,下面一一说明: 1.NOSORT,记录排序可选项. 默认情况下,在表中创建索引的时候,会对 ...
-
oracle 创建索引思考(转)
在Oracle数据库中,创建索引虽然比较简单.但是要合理的创建索引则比较困难了. 笔者认为,在创建索引时要做到三个适当,即在适当的表上.适当的列上创建适当数量的索引.虽然这可以通过一句话来概括优化的索 ...
-
Oracle 重建索引脚本
该指数是一个有力的武器,以提高数据库的查询性能. 没有索引,喜欢同样的标签库没有书籍,找书,他们想预订比登天还难.中,尤其是在批量的DML的情形下会产生对应的碎片.以及B树高度会发生对应变化.因此能够 ...
随机推荐
-
common-pool2 学习:thrift连接池的另一种实现
对象池是一种很实用的技术,经典的例子就是数据库连接池.去年曾经从零开始写过一个thrift客户端连接池.如果不想重造*,可以直接在apache开源项目commons-pool的基础上开发. 步骤: ...
-
CSS,bootstrap表格控制当td内容过长时用省略号表示,以及在不使用bootstrap时过长也用省略号表示
首先需要在table中设置table-layout:fixed; <table style="table-layout:fixed"></table> 然后 ...
-
MySQL基础 - 编码设置
刚开始工作的时候,在工作中遇到的与数据库相关的问题,多半跟编码有关,总结一下数据库编码的设置. 字符集 查看数据库支持的字符集: mysql> SHOW CHARACTER SET; 从图中可以 ...
-
【leetcode】3Sum Closest
3Sum Closest Given an array S of n integers, find three integers in S such that the sum is closest t ...
-
将服务器上的某些特定日志统一保存至XPS文件
<APACHost.CSV> Hostname,IP,OSType srv1,10.103.22.22,Win2003 srv2,10.103.22.37,Win2008 Import ...
-
用Jquery控制文本框只能输入数字和字母
用Jquery控制文本框只能输入数字和字母 $.fn.onlyNum = function () { $(this).keypress(function (event) { var eventObj ...
-
codeforces 8VC Venture Cup 2016 - Elimination Round C. Lieges of Legendre
C. Lieges of Legendre 题意:给n,m表示有n个为2的倍数,m个为3的倍数:问这n+m个数不重复时的最大值 最小为多少? 数据:(0 ≤ n, m ≤ 1 000 000, n + ...
-
玩转docker
开篇先论赌 (组词,赌博,....),时刻,每天都在赌! 何为赌?仁者见仁,智者必定又有一番见解,保持沉默,意见保留; ——改变思维模式,Ruiy让赌赢在“思维”!!!; 存在在IT界Ruiy定格,即 ...
-
NFC应用(二)读写器模式
NFC第二种应用场境就是所谓的读写器模式.既然有卡,当然就会有读写器,这两种模式是配合在一起使用的.两个卡放一起不能通信,两个读写器模式的设备也不能通信. NFC读写器一般支持以下一种或多种协议:Mi ...
-
Cortex-M3 动态加载一(地址无关代码实现)
这篇文章是自己疑惑究竟地址无关性是如何实现,然后查看汇编和CPU指令手册,最后分析解除自己疑惑的,高手不要鄙视,哈哈. 编译C代码时候需要制定--acps/ropi选项,如下例子: void Syst ...