组合索引的选择原则

表上的索引是根据什么建立的,特别是组合索引,有多个的时候优化器又怎么选择使用哪个呢,
今天做个试验验证下
新建这个表testindex
表结构
Name       Type          Nullable Default Comments
---------- ------------- -------- ------- --------
CREATETIME DATE          Y                        
LOC        VARCHAR2(100) Y                        
STATUS     VARCHAR2(20)  Y                        
COL1       VARCHAR2(10)  Y                        

testindex上只有两个索引
right1 loc,createtime,status
right2 createtime,loc,status

收集表统计信息
BEGIN
   DBMS_STATS.GATHER_TABLE_STATS(ownname => 'TEST',
                                 tabname => 'TESTINDEX',
                                 estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
                                 method_opt => 'for all columns size skewonly',
                                 cascade=>TRUE
                                 );
END;
收集统计信息可参考
http://blog.csdn.net/robinson1988/article/details/5329522

根据条件取值范围不同执行sql
Select *
From testindex
Where CREATETIME = :1
And  loc > :3
And  status =:4
走createtime,loc,status索引

Select *
From testindex
Where CREATETIME > :1
And  loc = :3
And  status =:4
走loc,createtime,status索引

说明选择组合索引时根据查询条件判断,取值越精准,范围越小的字段createtime/loc放前面的索引越优先被选择
这里收集统计信息还是很必要的,上面这个选择索引的规则和直方图,是否有其他索引关系应该不大

时间: 2024-10-27 16:10:46

组合索引的选择原则的相关文章

mysql数据库建立组合索引原则

现实中,mysql可以根据业务需要建立组合索引,由于mysql使用B-Tree格式索引,可以直接定位记录,无需扫描.mysql建立多列索引有最左前缀的原则,即最左优先,如: 如果有一个2列的索引(col1,col2),则已经对(col1).(col1,col2)上建立了索引: 如果有一个3列索引(col1,col2,col3),则已经对(col1).(col1,col2)和(col1,col2,col3)上建立了索引: 如何建立组合索引? 最频繁使用的列放在左边: 查看列的选择性(即该列的索引值

【oracle 性能优化】组合索引查询。

在Oracle中可以创建组合索引,即同时包含两个或两个以上列的索引.组合索引的使用存在着一定的局限,只有在谓词中出现全部索引列时才能使用效率最高的index unique scan, 否则谓词中必须包含前导列,否则会走Index full scan或者FTS. SQL> create index idx_test on yangtest (object_type,object_name); 索引已创建. SQL> exec dbms_stats.gather_table_stats(user,

数据库索引最左原则问题?急

问题描述 数据库索引最左原则问题?急 看了好多例子都是如下同样的解释: 多列字段做索引,state/city/zipCode,想要索引生效的话,只能使用如下的组合 state/city/zipCode state/city state 其他方式(如city,zipCode),则索引不会生效 但是:: 我发现如果 (city,zipCode,state)或者(city,state,zipCode)即只要包含最左的索引值.他在我执行 SQL的时候依然走了索引.这是怎么回事. 我用的MYSQL数据库

mysql 组合索引的实现原理是什么?

问题描述 mysql 组合索引的实现原理是什么? 在网络上看到资料了解到 mysql 的索引使用 B-tree 实现的,使用关键字来存储索引的列. 单列的索引是使用一个 B-tree 的方式实现的. 但是,网上的大多资料都没有提及,组合索引的具体实现. 我个人猜测组合索引也是使用一个 B-tree 来实现,其中关键字同时存储的是多个列的. B-tree 根据多个列进行排序.这样正好可以很好地解释"最左前缀". 不知道我的猜测是否正确?!!! 解决方案 MySql 的索引实现原理 解决方

数据中心发电机种类和容量的选择原则

现如今,随着我们日渐变得越来越依靠信息的处理和存储,使得数据中心在我们的生活中的地位显得日渐重要,世界各地正如雨后春笋般不断兴建着大大小小的数据中心.而数据中心的高临界性也使得我们对于数据中心的可用性需求达到了井喷似的激增. 当然,可能有诸多的因素能导致数据中心提供的服务中断,但其中最为主要的因素是电网故障,其将可能导致整个系统的瘫痪,除非提前进行了必要的备份. 那么我们对于发电机的种类和容量的选择至关重要. 数据中心发电机种类和容量的选择有如下四条原则: (1)首先要清楚数据中心是否是柴油发电

error 1089-MySQL中在创建表的时候创建组合索引,为什么我加了索引长度后就提示错误呢?

问题描述 MySQL中在创建表的时候创建组合索引,为什么我加了索引长度后就提示错误呢? 这是在创建表的同时创建了组合索引,并且添加了索引长度100,然后提示 ERROR 1089 (HY000): Incorrect prefix key; the used key part isn't a string, the used length is longer than the key part, or the storage engine doesn't support u nique pref

MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划_MongoDB

一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存在system.indexes 中,且默认总是为_id创建索引,它的索引使用基本和MySQL 等关系型数据库一样.其实可以这样说说,索引是凌驾于数据存储系统之上的另一层系统,所以各种结构迥异的存储都有相同或相似的索引实现及使用接口并不足为 奇. 1.基础索引 在字段age 上创建索引,1(升序);-1(降序): db.users.ensureIndex({age:1}) _id 是创建表的时候自动创建的索引,此索引是不能够删除的.当

雷霆战机雷霆战神上线 随意组合任你选择

雷霆战机雷霆战神上线 随意组合任你选择 关于雷霆战机雷霆战神的消息,从几个月前就不绝于耳.前段时间传出的雷霆战机雷霆战神将会在中秋节更新,但是内部原因未能如时上线,不过今日,雷霆战机雷霆战神上线了!雷霆战机雷霆战神更新,还带来了其他系统功能的更新,下面,就让我们来看一看雷霆战机本次的更新. 雷霆战机雷霆战神上线 随意组合任你选择 新版本震撼上线,玩家期待已久的机甲战神也终于揭开了神秘的面纱.更新之后,在任务奖励中新增了战神任务,能够帮助大家快速获得战神装备,http://www.aliyun.c

SQL Server 索引的创建原则

避免对经常更新的表进行过多的索引,并且索引中的列尽可能少.而对经常用于查询的字段(外键)应该创建索引,但要避免添加不必要的字段. 数据量小的表最好不要使用索引,由于数据较少,查询花费的时间可能比遍历索引的时间还要短,索引可能不会产生优化效果. 在条件表达式中经常用到的.不同值较多(主键的列)的列上建立索引,在不同值少的列上不要建立索引.比如在学生表的"性别"字段上只有"男"与"女"两个不同值,因此就无须建立索引.如果建立索引,不但不会提高查询效率