索引总结(三)

4. 聚集索引和非聚集的区别

聚集索引和非聚集索引的根本区别是数据记录的排列顺序和索引的排列顺序是否一致,聚集索引表记录的排列顺序与索引的排列顺序一致,优点是查询速度快,因为一旦具有第一个索引值的纪录被找到,具有连续索引值的记录也一定物理的紧跟其后,从而缩小了搜索范围,对于返回某一范围的数据效果最好。

聚集索引的缺点是对表进行修改速度较慢,这是为了保持表中的记录的物理顺序与索引的顺序一致,而把记录插入到数据页的相应位置,必须在数据页中进行数据重排,降低了执行速度。
  非聚集索引指定了表中记录的逻辑顺序,数据记录的物理顺序和索引的顺序不一致,聚集索引和非聚集索引都采用了B树的结构,但非聚集索引的叶子层顺序并不与实际的数据页相同,而采用指向表中的记录在数据页中位置的方式。非聚集索引比聚集索引层次多,添加记录不会引起数据顺序的重组。在有大量不同数据的列上建立非聚集索引,可以提高数据的查询和修改速度。

在对聚集索引列查询时,聚集索引的速度要比非聚集索引速度快。

在对聚集索引列排序时,聚集索引的速度要比非聚集索引速度快。但是如果数据量比较大时,如10万以上,则二者的速度差别不明显。

5. 聚集索引和非聚集的建立原则

在创建索引时要做到三个适当,即在适当的表上、适当的列上创建适当数量的索引。虽然这可以通过一句话来概括优化的索引的基本准则,但是要做到这一点的话,需要做出很大的努力。具体的来说,要做到这个三个适当有如下几个要求。

5.1 根据表的大小来创建索引。

虽然给表创建索引,可以提高查询的效率。但是需要注意的是,索引也需要一定的开销的。为此并不是说给所有的表都创建索引,那么就可以提高数据库的性能。这个认识是错误的。给所有的表都创建了索引,那么其反而会给数据库的性能造成负面的影响。因为此时滥用索引的开销可能已经远远大于由此带来的性能方面的收益。所以,数据库管理员首先需要做到,为合适的表来建立索引,而不是为所有的表建立索引。

一般来说,不需要为比较小的表创建索引。因为即使建立了索引,其性能也不会得到很大的改善。相反索引建立的开销,如维护成本等等,要比这个要大。也就是说,付出的要比得到的多,显然违反常理。

另外,就是对于超大的表,也不一定要建立索引。有些表虽然比较大,记录数量非常的多。但是此时为这个表建立索引并一定的合适。对于一些超大的表,建立索引有时候往往不能够达到预计的效果。而且在大表上建立索引,其索引的开销要比普通的表大的多。那么到底是否给大表建立索引呢?主要是看两个方面的内容。首先是需要关注一下,在这张大表中经常需要查询的记录数量。一般来说,如果经常需要查询的数据不超过10%15%的话,那就没有必要为其建立索引的必要。因为此时建立索引的开销可能要比性能的改善大的多。如果数据库管理员需要得出一个比较精确的结论,那么就需要进行测试分析。

5.2 根据列的特征来创建索引

列的特点不同,索引创建的效果也不同。需要了解为哪些列创建索引可以起到事半功倍的效果。同时也需要了解为哪些列创建索引反而起到的是事倍功半的效果。

索引设置的是否恰当,不仅跟数据库设计架构有关,而且还跟企业的经济业务相关。虽然一开始已经做了索引的优化工作。但是随着后来经济数据的增加,这个索引的效果会越来越打折扣。所以需要隔一段时间,对数据库的索引进行优化。该去掉的去掉,该调整的调整,以提高数据库的性能。

5.3 在一个表上创建多少索引合适

通常来说,表的索引越多,其查询的速度也就越快。但是,表的更新速度则会降低。这主要是因为表的更新同时也是索引的更新。到底在表中创建多少索引合适,就需要在这个更新速度与查询速度之间取得一个均衡点。如对于一些数据仓库或者决策型数据库系统,其主要用来进行查询。相关的记录往往是在数据库初始化的时候导入。此时,设置的索引多一点,可以提高数据库的查询性能。同时因为记录不怎么更新,所以索引比较多的情况下,也不会影响到更新的速度。相反,如果那些表中经常需要更新记录,如一些事务型的应用系统,数据更新操作是家常便饭的事情。此时如果在一张表中建立过多的索引,则会影响到更新的速度。由于更新操作比较频繁,所以对其的负面影响,要比查询效率提升要大的多。此时就需要限制索引的数量,只在一些必要的字段上建立索引。

总之,在适当的表、适当的列上建立适当的索引。具体的索引优化内容还是需要在日常工作中继续体会与总结。

下面的表总结了何时使用聚集索引或非聚集索引:

动作描述

使用聚集索引

使用非聚集索引

列经常被分组排序

返回某范围内的数据

不应

一个或极少不同值

不应

不应

小数目的不同值

不应

大数目的不同值

不应

频繁更新的列

不应

外键列

主键列

频繁修改索引列

不应

[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22934571/viewspace-1042718/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/22934571/viewspace-1042718/

<think>嗯,用户让我介绍一下Oracle中的索引总结。首先,我需要回忆一下Oracle数据库索引的相关知识,确保信息准确。索引数据库中非常重要,能显著提高查询速度,但不同类型的索引适用场景不同,这点需要详细说明。 用户可能想了解索引的基本概念,比如B树索引、位图索引、函数索引等。我应该先介绍每种索引的结构原理,然后说明它们的优缺点以及适用情况。比如,B树索引适合高基数列,而位图索引适合低基数列,像性别这样的字段。 还要注意索引的创建管理,比如如何创建、维护,以及索引的存储参数。用户可能关心如何选择合适的索引策略,所以需要给出一些实际例子,比如在OLTPOLAP环境中的不同选择。 另外,索引的维护也是重点,比如重建索引、监控索引使用情况。这部分用户可能容易忽略,但实际应用中很重要,避免索引过多导致性能下降。 可能需要提到组合索引的使用技巧,比如最左前缀原则,以及索引覆盖查询的优势。还有函数索引的使用场景,比如对字段进行函数操作后的查询优化。 用户可能有疑问为什么有时候索引不生效,可以简要说明索引失效的常见原因,比如隐式类型转换、使用函数导致索引无效等。 最后,总结一下如何根据实际业务需求选择合适的索引类型,并给出一些最佳实践,比如定期分析索引使用情况,删除无用索引等。确保回答结构清晰,分点说明,方便用户理解。</think>好的,我来总结一下 Oracle 数据库中的索引核心知识点,分以下几个部分: --- ### 一、索引基础概念 **作用**:加速数据检索的数据库对象(类似书籍目录) **代价**:占用存储空间,降低DML操作速度(需维护索引结构) --- ### 二、常用索引类型 #### 1. B-Tree 索引(平衡树索引) - **结构**:根节点 → 分支节点 → 叶子节点(存储ROWID键值) - **特点**: - 适合高基数(唯一值多)的列 - 支持精确查找范围查询 - **语法**: ```sql CREATE INDEX idx_name ON table(column); ``` #### 2. 位图索引(Bitmap Index) - **结构**:用位图存储键值与ROWID的映射 - **特点**: - 适合低基数(重复值多)的列(如性别、状态字段) - 适合OLAP场景 - 锁粒度大,不适合高并发DML - **语法**: ```sql CREATE BITMAP INDEX idx_name ON table(column); ``` #### 3. 函数索引 - **特点**:对列应用函数后的结果建立索引 - **典型场景**:`WHERE UPPER(name) = 'JOHN'` - **语法**: ```sql CREATE INDEX idx_name ON table(UPPER(column)); ``` #### 4. 组合索引(复合索引) - **规则**: - 遵循最左前缀原则(查询必须使用最左侧列) - 列顺序影响查询效率(高频查询列放左侧) - **语法**: ```sql CREATE INDEX idx_name ON table(col1, col2); ``` --- ### 、特殊索引类型 1. **反向键索引(Reverse Key)** - 反转键值,缓解热块争用(如序列主键的索引) - 语法:`CREATE INDEX idx_name ON table(column) REVERSE;` 2. **降序索引** - 支持`ORDER BY column DESC`优化 - 语法:`CREATE INDEX idx_name ON table(column DESC);` 3. **索引组织表(IOT)** - 表数据按索引结构存储,适用于主键频繁访问的场景 --- ### 四、索引使用策略 #### 1. 创建原则 - 在WHERE/JOIN/ORDER BY涉及的列上创建索引 - 小表(数据量 < 总行数5%)通常不需要索引 - 避免在频繁更新的列上过多建索引 #### 2. 索引失效场景 - 使用`IS NULL`/`IS NOT NULL` - 列参与函数运算(如`TO_CHAR(create_time)=...`) - 隐式类型转换(如字符串列使用数字查询) - 使用`LIKE '%value%`前导通配符 #### 3. 索引维护 - **重建索引**: ```sql ALTER INDEX idx_name REBUILD; ``` - **监控使用情况**: ```sql SELECT * FROM v$object_usage WHERE index_name = 'IDX_NAME'; ``` --- ### 五、性能优化要点 1. **索引覆盖查询**:SELECT只查询索引列时,无需回表 2. **索引跳跃扫描**(Oracle 9i+):组合索引跳过前导列查询 3. **索引压缩**:减少存储空间,语法:`CREATE INDEX ... COMPRESS` --- ### 六、实践建议 1. 定期使用`ANALYZE INDEX ... VALIDATE STRUCTURE`检查索引健康度 2. OLTP系统避免过多位图索引 3. 使用`DBMS_STATS`收集统计信息优化执行计划 需要具体案例分析或某个知识点的详细解释,可以随时告诉我! 📊
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值