SQL索引
SQL创建索引
create index <index-name> on <relation-name>(<attribute-list>);
create unique index <index-name> on <relation-name>(<attribute-list>);
SQL删除索引
drop index <index-name>;
码
- 搜索码:在文件中查找记录的属性或属性集
- 复合搜索码:一个包含多个属性的搜索码
- 不唯一搜索码:一个关系拥有多个包含同一搜索码值的搜索码
基本索引类型
顺序索引:基于值的顺序排序
- 聚集索引/主索引:包含记录的文件按搜索码指定顺序排序
- 非聚集索引/辅助索引:搜索码指定的顺序与文件中记录的顺序不同的索引
稠密索引:每个搜索码值都有一个索引项。
- 稠密聚集索引中,索引项包括搜索码值以及指向该搜索码值的第一条数据记录的指针
- 稠密非聚集索引中,索引项必须存储指向所有具有相同搜索码值的记录的指针列表
- 更快定位一条记录
插入
- 如果搜索码值不在索引中,就在合适位置插入具有该搜索码值的索引项
- 否则
1. 如果索引项存储的是指针列表,就在索引项中增加一个指向新纪录的指针
2. 否则,索引项存储一个仅指向具有相同搜索码值的第一条记录的指针,系统把插入的记录放到具有相同搜索码值的其他记录之后
删除
- 如果被删除的记录是具有这个特定搜索码值的唯一一条记录,系统就从索引中删除该索引项
- 否则
- 如果索引项存储的是指针列表,系统从索引项中删除指向被删除记录的指针
- 否则,索引项存储的是指向具有该搜索码值的第一条记录的指针。如果被删除的记录是具有该搜索码值的第一条记录,系统就更新索引项,使其指向下一条记录
稀疏索引:只为搜索码某些值建立索引项
- 只有索引是聚集索引可以用稀疏索引。每个索引项包括搜索码值以及指向该搜索码值的第一条数据记录的指针
- 所占空间小,插入、删除维护开销小
插入
- 如果系统创建一个新块,就把新块中出现的第一个搜索码值插入到索引中
- 否则
- 如果新插入的记录含有块中的最小搜索码值,系统就更新指向该块的索引项
- 否则,不作改动
删除
- 如果索引不包含具有被删除记录的搜索码值的索引项,索引不做修改
- 否则
- 如果被删除的记录是具有该搜索码值的唯一记录,系统用下一个搜索码值的索引替换响应的索引记录,如果下一个搜索码已经有一个索引项,就删除该索引项
- 否则,如果该搜索码值的索引记录指向被删除的记录,系统就更新索引项,使其指向具有相同搜索码值的下一条记录
多级索引
- 稀疏外层索引
- B+树
- 采用平衡树的结构,树根到树叶的每条路径长度相同
- n个指针P1,P2,…Pn,n-1个搜索码K1,K2,…,Kn-1。n和分区的块大小有关,使每个节点能存在一个块当中
- 根节点
- 如果根不是叶子,至少有2个孩子,可以小于⎡n/2⎤
- 如果根是叶子,可以有0~n-1个值
- 非叶节点
- 至少容纳⎡n/2⎤个指针,最多容纳n个指针
- P1指向小于K1的部分,Pm指向大于等于Km-1的部分
- 叶节点
- 至少有⎡(n-1./2⎤个值,最多有n-1个值
位图索引
- 每个位图都有和关系中记录数相等数目的位
- 如果编号i的记录在属性A上的值为j,那么值为j的位图中第i位设置为1,否则为0
- 多码索引时,执行多个位图的交(逻辑与)
覆盖索引
- 存储一些属性的值及指向记录的指针
- 仅仅使用索引就可以回答一些查询
散列索引:基于将值平均分布到若干散列桶中
桶:能存储一条或多条记录的一个存储单位,通常一个桶是一个磁盘块
散列函数:从搜索码值集合映射到桶地址集合的函数。要求分布时均匀的,随机的
- 静态散列
- 动态散列
- 可扩充散列
- 增加桶地址表
桶溢出
- 原因
- 桶不足
- 偏斜
- 解决
- 闭地址
- 桶数目选为
(n/f)∗(1+d)
,
n
为记录总数,
f 为一个桶能存放的记录数目, d 为避让因子一般为0.2 - 用溢出链链接溢出桶
- 开地址
- 将记录插入其他桶中
顺序索引和散列索引比较
- 顺序索引有利于随机访问,有利于值范围内的查询
- 散列索引有利于根据关键字查询