索引是什么?
索引是与表关联的可选结构,是一种快速访问数据的途径,可提高数据库性能。
数据库可以明确地创建索引,以加快对表执行SQL语句的速度。
当索引键作为查询条件时,该索引将直接指向包含这些值得行的位置。即便删除索引,也无需修改任何SQL语句的定义。
关于索引的一些原则
创建索引需要遵循的一些原则:
1) 频繁搜索的列可以作为索引。
2) 经常排序、分组的列可作为索引。
3) 经常用作连接的列(主键/外键)可作为索引。
4) 将索引放在一个单独的表空间中,不要放在有回退段、临时段和表的表空间中。
5) 对大型索引而言,考虑使用nologging字句创建大型索引。
6) 根据业务数据发生的频率,定期重新生成或重新组织索引,并进行碎片整理。
7) 仅包含几个不同值的列不可以创建为B数索引,可根据需要创建位图索引。
8) 不要在仅包含几行的表中创建索引。
删除索引需要遵循的一些原则:
1) 应用程序不再需要索引。
2) 执行批量添加前。大量添加数据前删除索引,可以调添加速度和更搞笑的使用索引空间。
3) 索引已损坏。
重建索引需要遵循的一些原则:
1) 用户表被移动到新的表空间后,表上的索引不会自动转义,此时需要将索引移动到指定表空间。
2) 索引中包含很多已删除的向。对表进行频繁删除,造成索引空间浪费,可以重建索引。
3) 需将现有的正常索引转换成反向键索引。
B树索引
B树索引也称为标准索引。索引的顶部为根,其中包含指向索引中下一级的项。下一级为分支块,分支块又指向索引中下一级的块。最低一级为叶节点,
其中包含指向表行的索引项。叶块为双向链接,有助于按关键字值的升序和降序扫描索引。
唯一索引和非唯一索引
唯一索引:
定义索引的列中任何两行都没有重复值。唯一索引中的索引关键字只能指向表中的一行。在创建主键约束和创建唯一约束时都会创建一个与之对
应的唯一索引。
非唯一索引:
单个关键字可以有多个与其关联的行。
反向键索引
与常规B树索引相反,反向键索引在保持列顺序的同事反转索引列的字节。反向键索引通过反转索引键的数据值来实现。其优点是对于连续增长的索引列,
反转索引列可以将索引数据分散在多个索引块间,减少I/O瓶颈的发生。
反向键索引通常建立在一些值连续增长的列上,如系统生成的员工编号,但不能执行范围搜索。
位图索引
位图索引的有点在于,它最适用于低基数列(即该列的值是有限的,理论上不会是无穷大)。
位图索引具有下列有点。
1.对于大批即时查询,可以减少相应时间。
2.相比其他索引计数,占用空间明显减少。
3.即使在配置很低的终端硬件上,也能获得显著的性能。
位图索引不应当用在频繁发生insert、update、delete操作的表上。这些DML操作在性能方面的代价很高。位图索引最适合用于数据仓库和决策支持系统。
组合索引
在表内多列上创建。索引中的列不必与表中的列顺序一致,也不必相互邻接,类似于SQL server中的复合索引。
组合索引最多包含32列。
基于函数的索引
若使用的函数或表达式涉及正在建立索引的表中的一列或多列,则创建基于函数的索引。可以将基于函数的索引创建为B树索引或位图索引。
关于索引的一些例子
/*
===========================================================
| 在薪水级别(salgrade)表中,为级别编号(grade)列创建唯一索引
============================================================
*/
CREATE UNIQUE INDEX index_unique_grade ON salgrade(grade);
/*
===========================================================
| 在员工(employee)表中,为员工编号(empno)列创建反向键索引
============================================================
*/
CREATE INDEX index_reverse_empno ON employee(empno) REVERSE;
/*
===========================================================
| 在员工(employee)表中,为工种(job)列创建位图索引
============================================================
*/
CREATE BITMAP INDEX index_bit_job ON employee(job);
/*
===========================================================
| 在员工(employee)表中,为员工名称(ename)列创建大写函数索引
============================================================
*/
CREATE INDEX index_ename ON employee(UPPER(ename));
/*
===========================================================
| 主键列创建反向键索引
============================================================
*/
CREATE UNIQUE INDEX idx_empno ON employee(empno) REVERSE;
--删除索引
DROP INDEX index_bit_job;
--将反向键索引更改为正常B树索引
ALTER INDEX index_reverse_empno REBUILD NOREVERSE;
--将索引移到指定表空间
ALTER INDEX index_name REBUILD TABLESPACE tablespace_name;
--创建B树索引
CREATE INDEX idx_emp_department
ON employee(deptno);
--创建位图索引
CREATE BITMAP INDEX idx_emp_job
ON employee(job);
--创建组合索引
CREATE INDEX idx_emp_name
ON employee(last_name,first_name);
-- 主键列创建反向键索引
CREATE UNIQUE INDEX idx_empno ON employee(empno) REVERSE;