索引的类型及结构
来源:互联网 发布:js获取object标签对象 编辑:程序博客网 时间:2024/06/14 01:22
1、索引的类型
(1、 按逻辑分,逻辑分类从应用程序的角度对索引进行分组
◎ 单列索引和组合列索引。
◎ 唯一性索引和非唯一性索引
◎ 函数索引
◎ 应用程序域索引
------------------------------------------------------------
◎ 单列索引和组合列索引。
单列索引:在索引关键字中仅有一列,例如:雇员表中雇员编号列上的索引
组合索引:由多个属性列组合起来的索引,比如(姓名,性别,城市),B树索引最多可以包括32列。
对于组合索引的字段顺序选择原则:⊕ 最频繁出现的列,放在前面,
⊕ 选择过滤条件最好的字段在前面
--比如: 组合索引(a,b,c),那查询的条件列可以选择索引的组合有如下几种: (a) (a,b) (a,b,c).
where a = x where a = x and b = x where a = x and b = x and c = x 注意:后期版本有跳转索引的功能
在 Oracle9i引入跳跃式扫描的索引访问方法之前,查询只能在有限条件下使用该索引。比如:表emp有一个组合索引键,该索引包含了empno、 ename和deptno。在Oracle9i之前除非在where之句中对第一列(empno)指定一个值,否则就不能使用这个索引键进行一次范围扫描。
从Oracle9i开始,索引跳跃式扫描特性可以允许优化器使用组合索引,即便索引的前导列没有出现在WHERE子句中。索引跳跃式扫描比全索引扫描要快的多。
注意:如果索引是多个列的组合索引,而其中列上包含NULL值,这一行就会处于包含NULL值的索引列中,且将被处理为空(视为NULL)。
技巧:索引列的值都存储在索引中。因此,可以建立一个组合(复合)索引,这些索引可以直接满足查询,而不用访问表。这就不用从表中检索数据,从而减少了I/O 量。 ---IOT?
◎ 唯一性索引和非唯一性索引
⊕ 唯一索引 保证定义索引的列中没有任何两行有重复值,唯一索引中的索引关键字只能指向表中的一行
通常,主键和唯一性约束,系统自动创建唯一性索引,也可以手工使用USING INDEX命令来创建
主键:create table a (a1 int primary key using index(create index ai on a (a1));
Create table a (x int primary key); ---自动创建索引
Create table b(x int primary key using index(create index ind_b on b(x))); --手动创建索引
唯一索引: ORACLE建议单独指定索引
Create table c(x int,y int,
constraint bu1 unique(x,y) using index (create unique index bi on c(x,y)),
constraint bu2 unique(y,x) using index bi);
主键和唯一索引的唯一区别就是:主键列不能为NULL值
⊕ 非唯一性索引,单个关键字可以有多个与其关联的行
唯一和非唯一的比较: ---可以参考下面的索引结构
B*树索引中有没有 非惟一(nonunique)条目,非唯一性条目 KEY + ROWID,是唯一的,在一个非惟一索引中,Oracle 会把rowid 作为一个额外的列(有一个长度字节)追加到键上,使得键惟一
(1)在一个惟一索引中,根据你定义的惟一性,Oracle 不会再向索引键增加rowid,所以唯一索引占用空间小,因为少了ROWID
(2)唯一性约束的REDO也小很多
(3)在非惟一索引中,数据会首先按索引键值排序(依索引键的顺序),然后按rowid 升序排序。而在惟一索引中,数据只按索引键排序
(4)一般来讲,在索引中找到一个key只需要执行2 或3次I/O。1次IO也可能,比如IOT或簇
◎ 函数索引(function-based index)
◎ 应用程序域索引
域索引,应用程序域索引称为扩展型索引
用于处理特殊应用的索引,如TEXT文本的搜索, 利用INTERMEDIA来搜索视频,指纹识别等
它相当于自定义索引规则的索引类型,我们前面基于逻辑对索引进行了分类,那我们接着基于索引的物理存储的不同,来介绍索引的类型。
域索引不是段,它不需要存储空间,它只是一种定义,所以域索引永远是SYS用户下的
------------------------------------------------------------
(2、按物理存储的不同,来介绍索引的类型
◎ 分区索引和非分区索引
◎ B*树索引(ORACLE默认类型)
◎ 位图索引
------------------------------------------------------------
◎ 分区索引和非分区索引
⊕ 非分区索引就是我们的常规表索引
⊕ 分区索引用于大型表的海量数据库VLDB,基于多个分区列上的索引存储到多个分区索引段。
基于表分区单独创建的索引称为本地索引,本地索引分前缀本地分区索引和非前缀本地分区索引。
基于全表的分区键来建立分区索引段的称为全局分区索引,全局分区索引只有前缀全局分区索引
10G主要有范围和HASH两种:
◎ B*树索引(ORACLE默认类型)
B树索引最多可以包括32列
B*树索引的构造类似于二叉树,能根据键提供一行或一个行集的快速访问,通常只需很少的读操作就能找到正确的行
B*树索引又下面几种:
⊕ 索引组织表 IOT其实就是种索引,而且是B*树索引,它只不过多了表数据
⊕ B*树聚簇索引 同样,聚簇索引也是B*树
⊕ 降序索引 在9I后,ORACLE提供了降序索引,也就是我们执行ORDER BY XXX DESC会用到降序索引,默认是升序。
它允许在索引中以降序(从大到小的顺序)存储一列,而不是升序(从小到大)存储
⊕ 反向键索引 用于RAC系统,键值顺序存放在的相同或者相邻的块上(几率比较大),容易造成并发热索引块。通过反转函数,将原来物理相邻的键值,分散到不相邻的索引块上,避免范围扫描时过度频繁扫描某些块。
B-tree 特点:
适合与大量的增、删、改(OLTP)
不能用包含OR操作符的查询;
适合高基数的列(唯一值多)
典型的树状结构;
每个结点都是数据块;
大多都是物理上一层、两层或三层不定,逻辑上三层;
叶子块数据是排序的,从左向右递增;
在分支块和根块中放的是索引的范围;
◎ 位图索引
------------------------------------------------
2、索引的结构
索引实体分两部分:
⊙ KEY部分
◎ KEY部分的长度
◎ KEY的实际数据
如果是非唯一性索引,那么KEY增加下面两项:
◎ ROWID的长度
◎ ROWID
⊙ DATA部分(可选项)
◎ 如果是唯一性索引,那么DATA部分是ROWID
◎ 如果是非唯一性索引,那么DATA部分是NULL
- 索引的类型及结构
- 索引及索引类型
- 12.2 索引结构类型
- Oracle的索引类型及使用技巧
- Oracle的索引类型及使用技巧
- oracle的索引类型及作用
- mysql的索引类型及优化
- Oracle的索引类型及使用技巧
- MySQL索引的类型及优缺点
- MySQL的索引类型及简单优化
- 数据库--索引的类型及特点
- 数据库--索引的类型及特点
- Mysql索引结构及常见索引的区别
- mysql索引及类型
- MySQL索引结构类型划分
- lucene索引结构(对lucene索引段中的各个类型的文件有所解释)
- 【0052】mysql索引类型及索引方法
- 索引的默认结构及对dml影响
- 读李战的悟透JavaScript的一点理解--深入了解预编译
- 百度地图SDK使用
- Repeater控件单双行不同背景色
- 冬瓜降温
- ubuntu下将中文桌面等改为英文Desktop等
- 索引的类型及结构
- 存活10年以上的图像处理资源链接
- 用户指南:自动切换打印机的位置感知打印功能——乡巴佬下载
- Sicily 1224 速配游戏 (SOJ 1224) 【暴力匹配】
- 【Hibernate】Hibernate如何映射枚举类型
- 调整Tomcat的并发线程到5000+
- 河南高校
- 从现象看本质 MIUI V4&V5全面对比解析
- mysql alter 语句用法,添加、修改、删除字段等