声明:虽然题目是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)

概念可见

Selectivity介绍

这个原理强调成本
        
          比如:
        
          ① 选择性强的字段放在前面、可以减少 Index Range Scan 的扫描成本
          ② 有个税务系统、原先的复合索引是(月份,税务机关代号,纳税人识别号,发票代号,收费类别)
               对于这个索引、优化器并没有选择走索引、而是全表扫、原因如下:
               ● 同一月份的记录太多了、超过1/3、全表扫成本低
               ● 字段顺序没有考虑可选性
               新的复合索引是(纳税人识别号,月份,收费类别,税务机关代号,发票代号)
           
           
     ㈢ 复合索引好处
        
          ① 尽可能让一个索引为更多的SQL服务
          ② 复合索引是排序的、ORDER BY涉及索引字段时、可减少排序成本
        
        
     我认为呢、在为复合索引字段排序时、应该综合考虑权衡前缀性和可选性、绝不可偏袒任何一方

本文转自:http://blog.csdn.net/dba_waterbin/article/details/8954690

oracle复合索引的选择和使用的更多相关文章

  1. Oracle 复合索引设计原理——前缀性和可选性

    前缀性: 复合索引的前缀性是指只有当复合索引的第一个字段出现在SQL语句的谓词条件中时,该索引才会被用到.如复合索引为(ename,job,mgr),只要谓词条件中出现第一个字段ename,就可以用复 ...

  2. 二十、oracle通过复合索引优化查询及不走索引的8种情况

    1. 理解ROWID ROWID是由Oracle自动加在表中每行最后的一列伪列,既然是伪列,就说明表中并不会物理存储ROWID的值:你可以像使用其它列一样使用它,只是不能对该列的值进行增.删.改操作: ...

  3. Oracle复合B*tree索引branch block内是否包含非先导列键值?

    好久不碰数据库底层细节的东西,前几天,一个小家伙跑来找我,非要说复合b*tree index branch block中只包含先导列键值信息,并不包含非先导列键值信息,而且还dump了branch b ...

  4. 转://Oracle 复合压缩索引场景及性能对比

    摘要:今天为什么提到这个话题,出于一个偶然,一个同事在优化新开发的系统时向我请教如何添加复合压缩索引的问题.我总结了一下,问题有三. 第一:需不需要压缩 第二:对第几列压缩 第三:性能对比,选出最优 ...

  5. Oracle 建立索引及SQL优化

    数据库索引: 索引有单列索引,复合索引之说,如果某表的某个字段有主键约束和唯一性约束,则Oracle 则会自动在相应的约束列上建议唯一索引.数据库索引主要进行提高访问速度. 建设原则: 1.索引应该经 ...

  6. SQL Server,Oracle,DB2索引建立语句的对比

    原文引至:http://jvortex.blog.163.com/blog/static/16961890020122141010878/ 我们知道,索引是用于加速数据库查询的数据库对象.原理就是减少 ...

  7. Oracle 创建索引的基本规则总结

    1.  选择索引字段的原则: 在WHERE子句中最频繁使用的字段 联接语句中的联接字段 选择高选择性的字段(如果很少的字段拥有相同值,即有很多独特值,则选择性很好) Oracle在UNIQUE和主键字 ...

  8. 索引优化原则及Oracle中索引总结

    索引建立原则 确定针对该表的操作是大量的查询操作还是大量的增删改操作. 尝试建立索引来帮助特定的查询.检查自己的sql语句,为那些频繁在where子句中出现的字段建立索引. where语句中不得不对查 ...

  9. oracle(七)索引

    一.B-Tree索引 (1). 选择索引字段的原则: 在WHERE子句中最频繁使用的字段 联接语句中的联接字段 选择高选择性的字段(如果很少的字段拥有相同值,即有很多独特值,则选择性很好) Oracl ...

随机推荐

  1. BZOJ 1036 [ZJOI2008]树的统计Count (树链剖分)(线段树单点修改)

    [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 14968  Solved: 6079[Submit][Stat ...

  2. 廖雪峰的git教程

    http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

  3. 事件溯源模式(Event Sourcing Pattern)

    此文翻译自msdn,侵删. 原文地址:https://msdn.microsoft.com/en-us/library/dn589792.aspx 本文介绍了一种有利于物化(materialize)领 ...

  4. 死磕 Fragment 的生命周期

    死磕 Fragment 的生命周期 本文原创,转载请注明出处.欢迎关注我的 简书 ,关注我的专题 Android Class 我会长期坚持为大家收录简书上高质量的 Android 相关博文.本篇文章已 ...

  5. JSON-JSON 百科

    1,百度百科 http://baike.baidu.com/view/136475.htm?fr=aladdin 2,JSON教程 http://www.w3school.com.cn/json/

  6. ~/.bash_profile介绍

    mac和linux终端一般用bash来进行解析.当bash在读完了整体环境变量的/etc/profile并借此调用其他配置文件后,接下来则是会读取用户自定义的个人配置文件.bash读取的文件总共有三种 ...

  7. Python转码问题的解决方法

    FROM: http://www.jb51.net/article/16104.htm 在Python中,可以对String调用decode和encode方法来实现转码.     比如,若要将某个St ...

  8. pip install 报错UnicodeDecodeError: 'ascii' codec can't decode byte

    2017-03-23 报错原因: pip安装Python包会加载我的用户目录,我的用户目录恰好是中文的,ascii不能编码. 解决办法: python目录 Python27\Lib\site-pack ...

  9. HDU 2767 Proving Equivalences (强联通)

    pid=2767">http://acm.hdu.edu.cn/showproblem.php?pid=2767 Proving Equivalences Time Limit: 40 ...

  10. Unix环境部署

    http://www.cnblogs.com/chuyuhuashi/p/4423699.html 分布式javahttp://www.cnblogs.com/tangyanbo/p/4499485. ...