声明:虽然题目是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. 3.非标准的NDEF格式数据解析--IsoDep

    1.使用目的:正常开发是针对NDEF格式数据进行开发,但实际情况并非如此,以厦门公交卡为例,厦门公交卡保存的是非NDEF格式数据.其类型是IsoDep类型. 2.非标准的NDEF格式数据流程:当厦门公 ...

  2. 我学MSMQ(二)

      上次我主要学习的是MSMQ的基本的概念.安装消息队列和新建了一个简单的队列.      现在我就继续学习关于消息队列的接收先还是概念         消息的接收又分成同步和异步方式两种,同步接收在 ...

  3. Linux的五个查找命令:find,locate,whereis,which,type 及其区别

    1. find find是最常见和最强大的查找命令,你可以用它找到任何你想找的文件. find的使用格式如下: $ find <指定目录> <指定条件> <指定动作> ...

  4. [Bug] 未找到导入的项目“C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\WebApplications\Microsoft.WebApplication.targets”

    This is very easy to do. Open your build definition and go to the "Process" page. Then und ...

  5. 【spring boot】spring boot 2.0 项目中使用mysql驱动启动创建的mysql数据表,引擎是MyISAM,如何修改启动时创建数据表引擎为【spring boot 2.0】

    默认创建数据表使用的引擎是MyISAM 2018-05-14 14:16:37.283 INFO 7328 --- [ restartedMain] org.hibernate.dialect.Dia ...

  6. 【IntellJ IDEA】idea启动测试类报错Error running 'Test1.test': Command line is too long. Shorten command line for Test1.test or also for JUnit default configuration.

    idea启动测试类报错 Error running 'Test1.test': Command line is too long. Shorten command line for Test1.tes ...

  7. Kubernetes 针对资源紧缺处理方式的配置

    如何在资源紧缺的情况下,保证 Node 的稳定性,是 Kubelet 需要面对的一个重要的问题.尤其对于内存和磁盘这种不可压缩的资源,紧缺就相当于不稳定. 在kubelet启动作为参数或者在配置文件中 ...

  8. java内存溢出分析工具:jmap使用实战

    在一次解决系统tomcat老是内存撑到头,然后崩溃的问题时,使用到了jmap. 1 使用命令 在环境是linux+jdk1.5以上,这个工具是自带的,路径在JDK_HOME/bin/下 jmap -h ...

  9. LVS/NAT

    平台:RedHat Enterprise Linux centos6.3       ipvsadm             ipvs 1. NAT模型 NAT模型:地址转换类型,主要是做地址转换,类 ...

  10. 报错kernel:NMI watchdog: BUG: soft lockup - CPU#0 stuck for 26s

    近期在服务器跑大量高负载程序,造成cpu soft lockup.如果确认不是软件的问题. 解决办法: #追加到配置文件中 echo 30 > /proc/sys/kernel/watchdog ...