索引知识总结

简介

索引是用于快速找到记录的一种数据结构

索引值匹配的方式

1.全值匹配(所有的列都进行匹配)
2.匹配最左前缀(只使用索引的第一列)
3.匹配列前缀(只匹配某一列值开头部分)
3.匹配范围值(查找值为某一范围时,只使用第一列)
4.覆盖索引(只访问索引,不访问数据行)

索引的优点

1.减少需扫描的数据量
2.避免排序和临时表
3.将随机IO表为顺序IO

索引类型

在mysql中,索引由存储引擎实现,不同的存储引擎索引的工作方式不同,底层实现不同。
mysql最常用的存储引擎是MyISAM和InnoDB。

1.B-Tree索引

B-Tree索引值按顺序排序,很适合查找范围数据。
索引多列值排序根据create table语句定义时的顺序决定。
B-Tree树能加快访问数据的速度,是因为使用了索引就不用进行全表扫描来获得数据。
根节点存放了指向子节点的指针,且叶子到根的距离相同,可通过指针查找叶子页,进而根据叶子页的上下限的值从而决定进入下一个叶子页。

对于B-Tree索引,InnoDB通过B+Tree实现,InnoDB按照原数据格式进行存储,
MyISAM使用前缀压缩技术,所以实际存储比较小,通过数据的物理位置引用被索引的行。

B-Tree索引使用限制

1.只能按匹配最左前缀的方式即,必须包含索引最前列
2.不能跳过索引中的列
3.某个列时范围值,则其后的所有索引都不能使用

2.哈希索引

哈希索引基于哈希表实现,需要精确匹配索引的所有列值才能生效,每一行数据都被存储引擎赋予一个哈希码,通过不同的键值索引得到哈希码,从而在哈希表中找到指向数据行的指针。
mysql中只有memory索引支持哈希索引。InnoDB有自适应哈希索引功能,当索引值使用很频繁时,可以在B-Tree上创建哈希索引。这个功能无需用户设置,由系统自行启动使用。

<think>嗯,用户让我介绍一下Oracle中的索引总结。首先,我需要回忆一下Oracle数据库索引的相关知识,确保信息准确。索引数据库中非常重要,能显著提高查询速度,但不同类型的索引适用场景不同,这点需要详细说明。 用户可能想了解索引的基本概念,比如B树索引、位图索引、函数索引等。我应该先介绍每种索引的结构和原理,然后说明它们的优缺点以及适用情况。比如,B树索引适合高基数列,而位图索引适合低基数列,像性别这样的字段。 还要注意索引的创建和管理,比如如何创建、维护,以及索引的存储参数。用户可能关心如何选择合适的索引策略,所以需要给出一些实际例子,比如在OLTP和OLAP环境中的不同选择。 另外,索引的维护也是重点,比如重建索引、监控索引使用情况。这部分用户可能容易忽略,但实际应用中很重要,避免索引过多导致性能下降。 可能需要提到组合索引的使用技巧,比如最左前缀原则,以及索引覆盖查询的优势。还有函数索引的使用场景,比如对字段进行函数操作后的查询优化。 用户可能有疑问为什么有时候索引不生效,可以简要说明索引失效的常见原因,比如隐式类型转换、使用函数导致索引无效等。 最后,总结一下如何根据实际业务需求选择合适的索引类型,并给出一些最佳实践,比如定期分析索引使用情况,删除无用索引等。确保回答结构清晰,分点说明,方便用户理解。</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`收集统计信息优化执行计划 需要具体案例分析或某个知识点的详细解释,可以随时告诉我! 📊
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值