Oracle中索引的原理

Posted 想飞的毛毛虫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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是一种平衡树,数据存储在叶子节点上,检索节点上的数据所走的步数长度是一样的,数据结构见下图。
B-Tree结构

2.11语法B-Tree基本介绍

`` create index <index_name> on <table_name> ( <column1>, <column2>, … );

2.12例子

建立索引的例子

2.2Bitmap索引

Bitmap类index是存储在一个二维表中,行是rowid,列名称是属性的取值范围,表格中的数据是属性值。具体如下
bitmap
Bitmap主要用于选定的列中,属性取值范围比较小的,如为性别(male,female),衣服尺寸(S,M,L)等,而且在读取比较多的系统中使用较多。

2.21 语法

CREATE BITMAP INDEX Index_Name ON Table_Name (Column_Name);

2.22 例子

bitmap 索引例子

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

以上是关于Oracle中索引的原理的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 复合索引设计原理——前缀性和可选性

没索引oracle无唯一索引交换分区会丢失数据?

InnoDB索引查询原理

如何在 Toad for Oracle 中使用自定义代码片段?

oracle 索引聚簇表的工作原理

oracle中,索引是干啥用的?