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)

概念可见

Selectivity介绍

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

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

时间: 2024-10-13 16:08:34

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

Oracle复合索引+空值的索引使用问题

昨天在QQ群里讨论一个SQL优化的问题,语句大致如下: select A,min(B) from table group by A;--A,B都没有not null约束,A列无空值,B列有空值.--存在复合索引IX_TEST(A,B) 于是手动测试,环境采用Oracle自带的scott用户下的emp表. 1.首先查看如下语句的执行计划(此时表只有主键索引): 2.添加IX_TEST(deptno,comm)后查看执行计划: 发现依然是全表扫描. 3.为deptno列添加非空约束后再次查看执行计划

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

前缀性: 复合索引的前缀性是指只有当复合索引的第一个字段出现在SQL语句的谓词条件中时,该索引才会被用到.如复合索引为(ename,job,mgr),只要谓词条件中出现第一个字段ename,就可以用复合索引,否则不会用.唯一的例外是skip scan index,就是如果Oracle发现第一个字段的值很少,会自动拆分为两个复合索引.如复合索引(gender,ename,job,mgr),因为第一个字段gender只有两个值:男和女,因此Oracle会将这个索引拆分成('男',ename,job,

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

好久不碰数据库底层细节的东西,前几天,一个小家伙跑来找我,非要说复合b*tree index branch block中只包含先导列键值信息,并不包含非先导列键值信息,而且还dump了branch block,用以证明他的说法,从常理和SQL的语句执行信息就可以知道,他的说法是有问题的,但如何证明这一点呢?为了证明这点,也麻烦一次,玩玩多年不碰的dump.下面是他证明自己观点的两个dump结果(一个为单键索引,另一个是复合索引): 下面是本人的测试过程和结果: create table t1(c

复合索引介绍

什么是复合索引 1.1           复合索引定义 索引可以包含一个.两个或更多个列.两个或更多个列上的索引被称作复合索引. 利用索引中的附加列,您可以缩小搜索的范围,但使用一个具有两列的索引不同于使用两个单独的索引.复合索引的结构与电话簿类似,人名由姓和名构成,电话簿首先按姓氏对进行排序,然后按名字对有相同姓氏的人进行排序.如果您知道姓,电话簿将非常有用:如果您知道姓和名,电话簿则更为有用,但如果您只知道名不姓,电话簿将没有用处. 所以说创建复合索引时,应该仔细考虑列的顺序.对索引中的所

Oracle 建立索引及SQL优化

Oracle 建立索引及SQL优化 数据库索引: 索引有单列索引 复合索引之说 如何某表的某个字段有主键约束和唯一性约束,则Oracle 则会自动在相应的约束列上建议唯一索引.数据库索引主要进行提高访问速度. 建设原则: 1.索引应该经常建在Where 子句经常用到的列上.如果某个大表经常使用某个字段进行查询,并且检索行数小于总表行数的5%.则应该考虑. 2.对于两表连接的字段,应该建立索引.如果经常在某表的一个字段进行Order By 则也经过进行索引. 3.不应该在小表上建设索引. 优缺点:

mysql复合索引、普通索引总结

对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效.下面用几个例子对比查询条件的不同对性能影响. create table test(a int,b int,c int,KEY a(a,b,c)); 优: select * from test where a=10 and

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

原文引至:http://jvortex.blog.163.com/blog/static/16961890020122141010878/ 我们知道,索引是用于加速数据库查询的数据库对象.原理就是减少查询的IO操作,从而达到加速的目的.本文我们主要对SQL Server,Oracle,DB2上的索引建立语句进行了总结,接下来就让我们一起来了解一下这部分内容. 索引的种类: 聚集索引:根据数据行的键值在表或视图中排序和存储这些数据行. 非聚集索引:具有独立于数据行的结构. 唯一索引:确保索引键不包

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

索引建立原则 确定针对该表的操作是大量的查询操作还是大量的增删改操作. 尝试建立索引来帮助特定的查询.检查自己的sql语句,为那些频繁在where子句中出现的字段建立索引. where语句中不得不对查询列采用函数查询,如upper函数,最好建立相应函数索引: 在SQL语句中经常进行GROUP BY.ORDER BY的字段上建立索引 用于联接的列(主健/外健)上建立索引: 在经常存取的多个列上建立复合索引,但要注意复合索引的建立顺序要按照使用的频度来确定: 尝试建立复合索引来进一步提高系统性能.修

SQL Server和Oracle数据库索引介绍

SQL Server和Oracle数据库索引介绍 1 SQL Server中的索引 索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度.索引包含由表或视图中的一列或多列生成的键.这些键存储在一个结构(B 树)中,使 SQL Server 可以快速有效地查找与键值关联的行. 表或视图可以包含以下类型的索引: 聚集索引 聚集索引根据数据行的键值在表或视图中排序和存储这些数据行.索引定义中包含聚集索引列.每个表只能有一个聚集索引,因为数据行本身只能按一个顺序排序. 只有当表包含聚集索引