Oracle中索引的原理
前言:本文解决的问题
- Oracle中使用Index一定会加快查找速度吗?
- B+Tree和Bitmap索引的区别
- 索引的原理
1 索引的基本概念
索引是一种数据库结构,能够就数据库中的某列提供快速查询,而不用检索整个表格。建立索引时,oracle会首先对全表进行搜索,然后把要建立索引的字段排序,并构建构建索引条目(包含字段值和该字段在原表中的地址值rowid),把索引条目存储到索引段中。
An index is a database structure that provides quick lookup of data in a column or columns of a table.
说到底了,这是用空间来换时间,但是查找对于经常要搜索的字段,尤其对于table数据很多的情况下,有索引速度还是快很多。可以形象地把索引类比于百科全书的目录,虽然多了几页目录,但是查找起来不需要一页一页搜寻,速度还是快很多。
2 索引的分类
索引里面的元素是排序的,如果不止一列,那么第一列是主排序,然后再根据后面的列顺序依次排序。oracle中默认使用的是B-Tree索引。
2.1B-Tree索引(ORACLE默认的)
B-Tree是一种平衡树,数据存储在叶子节点上,检索节点上的数据所走的步数长度是一样的,数据结构见下图。
2.11语法B-Tree基本介绍
`` create index <index_name> on <table_name> ( <column1>, <column2>, … );
2.12例子
2.2Bitmap索引
Bitmap类index是存储在一个二维表中,行是rowid,列名称是属性的取值范围,表格中的数据是属性值。具体如下
Bitmap主要用于选定的列中,属性取值范围比较小的,如为性别(male,female),衣服尺寸(S,M,L)等,而且在读取比较多的系统中使用较多。
2.21 语法
CREATE BITMAP INDEX Index_Name ON Table_Name (Column_Name);
2.22 例子
2.3 二者区别
B-Tree索引适合属性值取值范围很大的,而bitmap索引适合于属性值取值范围小的。
3使用索引注意事项
- oracle创建主键时会自动在该列上创建索引
- 经常进行连接查询的列应该创建索引
- 使用create index时要将最常查询的列放在最前面
- 在使用where和join的属性上建立索引
- 在外键(foreign key)上建立索引
4 索引的缺点
-
索引并不一定加快查询速度,尤其是对于比较小的表来说
-
索引是用空间换时间来实现快速查询,因此也势必会拖慢insert、delete、update等操作,因为每次操作后索引也必须更新。
参考文献
https://dev.to/databasestar/a-guide-to-indexes-in-oracle
https://docs.oracle.com/cd/E11882_01/server.112/e40540/indexiot.htm#CNCPT811
https://www.cnblogs.com/wishyouhappy/p/3681771.html