文章目录

1 概念

修改中,请稍等。。。

1. 索引是什么?
   (1) 一种供服务器在表中快速查找一行的 '数据库结构'
   (2) 可以理解为:一本书中的 '目录'
   2. 索引的优点
   (1) 加快数据的 '检索速度'
   (2) 可以保证列值的 '唯一性'unique、主键)
   (3) 实现表与表之间的 '参照完整性'(外键)
   (4) 在使用 order bygroup by 子句时,可以减少排序和分组的时间   	
3. 索引的缺点
   (1) 当对表数据进行 DML 操作的时候,索引自动维护,'降低 DML 操作的速度'
   (2) 索引需要占 '物理空间',同数据表的 '表空间' tablespace 一样
   (3) 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加
4. 索引的使用原则
   (1) '主键''外键' 会自动创建索引,无需人工操作
   (2) 选择正确的表:经常检索包含大量数据的表中小于 15% 的行
   (3) 选择正确的列:多个表之间的关联关系
   (4) 合理安排索引列:(A,B,C) A 最常用,B 次之,C 最末

 
 

2 语法

基础数据准备:学生信息表

create table scott.student_info (
  sno   number(3) constraint pk_si_sno primary key,
  sname varchar2(30),
  sex   varchar2(2),
  age   number(3)
);

 
 

查询索引信息:(主键:自动 unique 索引:唯一性约束)

select *
  from dba_indexes t
 where t.owner = 'SCOTT'
   and t.table_name = 'STUDENT_INFO';

 
 

查询截图:
在这里插入图片描述

2.1 创建索引

语法:

create [unique | bitmap] index [schema.] 索引名
on [schema.] 表名 (列名1, .., 列名N);

 
 
1. 创建 '一般索引''B-Tree' 索引)
   create index scott.idx_si_sname on scott.student_info(sname);
   create index scott.idx_si_sname_age on scott.student_info(sname, sex);
2. 创建 '位图索引'
   create bitmap index scott.bidx_si_sex on scott.student_info(sex);

 
 

2.2 查询、修改、删除

1. 查询索引
   select t.*
     from dba_indexes t
    where t.owner = 'SCOTT'
      and t.table_name = 'STUDENT_INFO';
2. 修改索引
   -- 修改索引名称 idx_si_sname -> idx_si_sname_new
   alter index scott.idx_si_sname rename to idx_si_sname_new;
   -- 修改索引为无效
   alter index scott.idx_si_sname_new unusable;
   -- 重建索引
   alter index scott.idx_si_sname_new rebuild online;
3. 删除索引
   drop index scott.idx_si_age;

 
 

3 扩展

3.1 索引类型

3.1.1 B-Tree 索引

1. B-Tree 索引
   (1) B 代表 "平衡(balanced)" 是一种树结构 -- 不是 "二叉树" 哦
   (2) Oracle '默认' 的索引类型
2. 使用场景
   (1) 列的数据中,'不同值的个数很多'
   (2) 如:主键列(值不相同、值个数多)

 
 

原理图示:读取 rowid = 82 的数据块过程演示
在这里插入图片描述案例分析:定位数值 82 的过程

  1. 读取 root 节点,判断 82 在 0-120 之间,走左边分支
  2. 读取左边 branch 节点,判断 82 在80-120 之间,走右边分支
  3. 读取右边 leat 节点,在该节点中找到数据 82 及对应的 rowid
  4. 使用 rowid 去物理表中读取记录数据库块(如果是 count 或 仅 select rowid,则不需要本次读取)

上述案例中:
1、在整个索引定位过程中,数据块的读取只有 3 次。既 三次I/O 后定位到rowid。
2、在整个扩张过程中,B-Tree 自身总能保持平衡,Leaf 节点的深度能一直保持一致。(故而为 “平衡树”

3.1.2 位图索引(bitmap)

适用场景:

1. 列的基数很小(不同值的个数少)
2. 列用于布尔代数运算(andornot
 
 

原理图示:

姓名(Name)性别(Gender)身份证(ID_Card)婚姻状况(Marital)
n1421…未婚
n2422…已婚
n3421…未婚
n4422…离婚
n5422…未婚
。。。。。。。。。。。。

案例分析:现有以下查询

SELECT * FROM table t WHERE t.Gender = "女" AND t.Marital = "未婚";

 
 

全表扫描 FULL 和 B-Tree 索引 的使用情况分析:

1. 不适用索引
	(1) 不使用索引时,数据库只能一行行扫描所有记录,然后判断该记录是否满足查询条件
	(2) 一般情况下,当取出来的数据超过表 2%~4% 时,比较合适
2. B-Tree 索引
	(1) 对于 "性别(Gender)",可取值的范围只有 '男','女',并且男和女可能各站该表的 '50%' 的数据,
	    这时添加 'B-Tree 索引' 还是需要取出一半的数据, 因此完全没有必要。
	(2) 相反,如果某个字段的取值 "范围很广,几乎没有重复",比如 "身份证号",使用 'B-Tree 索引' 比较合适
	(3) 事实上,当取出来的数据超过表 2%~4% 时,即使添加了 'B-Tree 索引', 
	    Oracle 也不一定会使用 'B-Tree 索引',很可能 Oracle 解析器认为 '全表扫描' 更加好

 
 

位图索引原理:

  • 如果在 性别(Gender) 列上建立了 位图索引,对于 性别(Gender) 这个列,针对每行的 rowid(rowid可以理解为每行的物理位置),位图索引形成两个向量,
  • 男:10010, 女:01101
  • 其中 1:表示男,0:表示女。
Rowid12345
10010
01101

同理:婚姻状况(Marital) 的 位图索引如下

Rowid12345
已婚01000
未婚10101
离婚00010

位图检索过程: (与运算,全 1 得 1)

Rowid12345
01101
and
未婚10101
结果00101
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐