索引
- 什么是索引
- 索引的分类
- B树索引
- 唯一索引和非唯一索引
- 反向键索引
- 位图索引
- 其它索引
- 索引使用原则
- 总结
什么是索引
索引是与表关联的可选结构,是一种快速访问数据的途径,可提高数据库性能。数据库可以明确的创建索引,以加快对表的执行sql语句的速度,当索引键作为查询条件时,该索引将直接指向包含这些值的行的位置,即便删除索引,也无需修改任何sql语句的定义
索引的分类
物理分类 | 逻辑分类 |
分区或非分区索引 | 单列或组合索引 |
B树索引 | 唯一或非唯一索引 |
正常或反向键索引 | 基于函数索引 |
位图索引 |
B树索引
B树索引通常也称为标准索引。索引的顶部为根
,其中包含指向索引中下一级的项。下一级为分之块,分之块又指向索引下一级的块,最低一级为叶节点
,其中包含指向表行的索引项。叶块为双向链表
,有助于按关键字的升序和降序扫描索引
SQL>create [unique] index_name on table_name(column_list)
[tablespace tablespace_name]
- unique
:用于指定唯一索引,默认情况下为非唯一索引- index_name
:索引名- table_name
:表名- column_list
:列名,可以是多个列,使用逗号分隔- tablespace_name
:为索引指定表空间
唯一索引和非唯一索引
- 唯一索引:
定义索引的列中任何两行都没有重复值。唯一索引中的索引关键字只能指向表中的一行。在创建主键约束和创建唯一约束时都会创建一个与之对应的唯一索引
- 非唯一索引:
单个关键字可以有多个与其关联的行
反向键索引
与常规B树索引相反,反向键索引在保持列顺序的同时反转列的字节。反向索引通过反转索引
键的数据值来实现,其优点是对于连续增长的索引列,反转索引列可以将索引数据分散在多
个索引块间,减少I/O瓶颈的发生。
SQL>create unique index_reverse_name on table_name(column_list) REVERSE;
REVERSE
位图索引
位图索引的优点在于,它最适于
低基数列
(该列的值是有限的,理论上不会是无穷大的)。列如,员工表中的工种(job列),即便是有几百万条员工记录,工种也是可计算的,工种列可以作为位图索引
,类似的还有图书表类别列等。
位图索引具有下列优点
- 对于大批即时查询,可以减少响应时间
- 相比其他索引技术,占用空间明显减少
- 即使在配置很低的终端硬件,也能获得显著的性能
位图索引不直接存储rowId,而是存储字节位到rowId的映射,减少响应时间,节省空间占用位图索引
不应当应用到频繁发生insert
,update
,delete
操作的表上,这些DML操作在性能方面代价很高,位图索引最适合于数据仓库和决策支持系统
SQL>create bitmap index index_bit_name on table_name(column_name)
其它索引
- 组合索引:在表内多列上创建索引,索引中列不必与表中的列顺序一致,也不必相互邻接
- 使用场景:当某几个字段在SQL语句的where字句中经常通过and操作符联合在一起使用作为过滤条键谓词
- 复合索引字段排序原则
- 最
频繁
使用的字段排在第一位 - 使用频率相同,则将最具
选择性
的字段放在前面
- 基于函数索引:若使用的函数或表达式涉及正在建立的表中的一列或多列,则创建基于函数的索引,可以将给予函数的索引创建为B树或位图索引。
- 表达式中不能出现聚合函数,
- 不能在LOB类型的列上创建,
- 创建时必须具有QUERT REWRITE权限
索引使用原则
- 表中导入数据后在创建索引。否则每次表中插入数据都必须更新索引
- 在适当的表和字段创建索引,如果经常检索的数据少于表中的15%则需要创建索引
- 限制表中索引的数目,索引越多,在修改表时索引做出修改的工作量越大
总结
- B树索引是一个通用索引,在创建索引时它就是默认索引类型
- 反向键索引建立在值是连续增长的列上
- 位图索引适合创建在低基数列上
- 基于函数索引
- 索引使用原则