oracle复合索引的选择和使用
声明:虽然题目是Oracle、但同样适合MySQL InnoDB索引
在大多数情况下、复合索引比单字段索引好
很多系统就是靠新建一些合适的复合索引、使效率大幅度提高
复合索引比单字段索引复杂、有两个原则需把握:前缀性和可选性
但是、可叹的是、国内很多IT系统开发人员没有意识到应该优先设计复合索引
更没有充分理解复合索引的前缀性和可选性这两个重要原则
㈠ 前缀性(Prefixing)
在谓词条件中、只有将复合索引的第一个字段作为约束条件、该复合索引才会被用上
当然、存在一种例外:Index Skip Scan
这个原理强调使用
比如:
① 假如c1的选择性比c2高很多、且如果有大量如下查询:
select * from t where c1= :x and c2= :y;
select * from t where c2= :y;
这个时候(c2,c1)比(c1,c2)好
② 有ID和CREATE_TIME这两个字段、一个是主键、一个是创建时间
按一般情况、创建复合索引时、需要将ID放在前面、
不过、如果以CREATE_TIME为查询条件的SQL比较多、而ID的使用比较少
那么、我们在设计时、应该把CREATE_TIME前缀
㈡ 可选性(Selectivity)
概念可见
这个原理强调成本
比如:
① 选择性强的字段放在前面、可以减少 Index Range Scan 的扫描成本
② 有个税务系统、原先的复合索引是(月份,税务机关代号,纳税人识别号,发票代号,收费类别)
对于这个索引、优化器并没有选择走索引、而是全表扫、原因如下:
● 同一月份的记录太多了、超过1/3、全表扫成本低
● 字段顺序没有考虑可选性
新的复合索引是(纳税人识别号,月份,收费类别,税务机关代号,发票代号)
㈢ 复合索引好处
① 尽可能让一个索引为更多的SQL服务
② 复合索引是排序的、ORDER BY涉及索引字段时、可减少排序成本
我认为呢、在为复合索引字段排序时、应该综合考虑权衡前缀性和可选性、绝不可偏袒任何一方
本文转自:http://blog.csdn.net/dba_waterbin/article/details/8954690
oracle复合索引的选择和使用的更多相关文章
- Oracle 复合索引设计原理——前缀性和可选性
前缀性: 复合索引的前缀性是指只有当复合索引的第一个字段出现在SQL语句的谓词条件中时,该索引才会被用到.如复合索引为(ename,job,mgr),只要谓词条件中出现第一个字段ename,就可以用复 ...
- 二十、oracle通过复合索引优化查询及不走索引的8种情况
1. 理解ROWID ROWID是由Oracle自动加在表中每行最后的一列伪列,既然是伪列,就说明表中并不会物理存储ROWID的值:你可以像使用其它列一样使用它,只是不能对该列的值进行增.删.改操作: ...
- Oracle复合B*tree索引branch block内是否包含非先导列键值?
好久不碰数据库底层细节的东西,前几天,一个小家伙跑来找我,非要说复合b*tree index branch block中只包含先导列键值信息,并不包含非先导列键值信息,而且还dump了branch b ...
- 转://Oracle 复合压缩索引场景及性能对比
摘要:今天为什么提到这个话题,出于一个偶然,一个同事在优化新开发的系统时向我请教如何添加复合压缩索引的问题.我总结了一下,问题有三. 第一:需不需要压缩 第二:对第几列压缩 第三:性能对比,选出最优 ...
- Oracle 建立索引及SQL优化
数据库索引: 索引有单列索引,复合索引之说,如果某表的某个字段有主键约束和唯一性约束,则Oracle 则会自动在相应的约束列上建议唯一索引.数据库索引主要进行提高访问速度. 建设原则: 1.索引应该经 ...
- SQL Server,Oracle,DB2索引建立语句的对比
原文引至:http://jvortex.blog.163.com/blog/static/16961890020122141010878/ 我们知道,索引是用于加速数据库查询的数据库对象.原理就是减少 ...
- Oracle 创建索引的基本规则总结
1. 选择索引字段的原则: 在WHERE子句中最频繁使用的字段 联接语句中的联接字段 选择高选择性的字段(如果很少的字段拥有相同值,即有很多独特值,则选择性很好) Oracle在UNIQUE和主键字 ...
- 索引优化原则及Oracle中索引总结
索引建立原则 确定针对该表的操作是大量的查询操作还是大量的增删改操作. 尝试建立索引来帮助特定的查询.检查自己的sql语句,为那些频繁在where子句中出现的字段建立索引. where语句中不得不对查 ...
- oracle(七)索引
一.B-Tree索引 (1). 选择索引字段的原则: 在WHERE子句中最频繁使用的字段 联接语句中的联接字段 选择高选择性的字段(如果很少的字段拥有相同值,即有很多独特值,则选择性很好) Oracl ...
随机推荐
- POJ 3253 Fence Repair【哈弗曼树/贪心/优先队列】
Fence Repair Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 53645 Accepted: 17670 De ...
- [Math Review] Statistics Basic: Sampling Distribution
Inferential Statistics Generalizing from a sample to a population that involves determining how far ...
- -------------》》》【Vim】vim的一些简单配置~
在linux下使用 :vsp ~/.vimrc 来打开配置文件 一些命令[任何命令前加上 ! 强制执行]: :w 保存 :wq 保存退出 :q 退出 ctrl ...
- 用kermit通过串口往nandflash任意地址里烧写任何文件!
1.安装kermit #apt-get install ckermit 2.使用kermit之前,在用户宿主目录下(/home/用户名/)创建一个名为.kermrc的配置文件,内容如下 : set l ...
- ArcMAP定义投影坐标
WGS84形式的高斯克吕格投影在ArcGIS系统中是不存在的,需要自己去定义.下面为MARK的定义过程.
- background属性总结,background-image路径问题相对于css和js
(1)background属性总结 background 简写属性在一个声明中设置所有的背景属性. 可以设置如下属性:background-color规定要使用的背景颜色.background-pos ...
- Visio文件转EPS文件
Visio转eps by gaihf@水木 看了前人写的关于Visio转EPS的文章,但是实践过程中还是碰到几个棘手的问题.现在这些问题终于解决了,把自己的一点体会分享给大家. 很多人习惯用Visio ...
- Spring注释事务失效及解决办法
如果带上事务,那么用annotation方式的事务注解和bean配置,事务会失效,要将service bean配置到xml文件中才行 在主容器中(applicationContext.xml),将C ...
- log4j教程 3、架构
Log4j API设计为分层结构,其中每一层提供了不同的对象,对象执行不同的任务.这使得设计灵活,根据将来需要来扩展. 有两种类型可用在Log4j的框架对象. 核心对象: 框架的强制对象和框架的使用. ...
- SparkMLlib聚类学习之KMeans聚类
SparkMLlib聚类学习之KMeans聚类 (一),KMeans聚类 k均值算法的计算过程非常直观: 1.从D中随机取k个元素,作为k个簇的各自的中心. 2.分别计算剩下的元素到k个簇中心的相异度 ...