第三章 索引与散列

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
then insert_in_leaf(L, K, P) else begin/* L已经含有n-1搜索码 ,分裂L*/
创建结点L’ 把L.P1,…,L.Kn-1复制到可以存储n个(指针,搜索码)对的内存块T insert_in_leaf(T, K, P) 令L’.Pn=L.Pn;令L.Pn=L’ 从L中删除L.P1,…,L.Kn-1 把T.P1,…,T.Kn/2|从T中复制到L中,以 L.P1作为开始 把T. Kn/2|+1 ,…,T. Kn从T中复制到L’中,以 L’.P1作为开始 令K’表示L’中最小搜索码值
(1)散列函数
要求: (a)分布均匀,每个桶分配到的记录数相同。 (b)分布是随机的。 实际中不可能做到。
(2)桶溢出控制
溢出原因: • 桶不足,桶数比实际需要多20%。 • 偏斜,某些桶分到的记录比其它桶多。
1)多个记录码值相同。 2)h不好造成分布不均匀。
溢出桶用溢出链表示――闭散列,数据库常用。
end
*删除:
• 从图12-12的B+树中删除“Downtown”。 用查找算法,定位“Downtown”的索引项。当 从“Downtown”索引项所在的叶结点中把它删 除后,叶结点变为空。这个结点必须从树中 删除。删除叶结点后,必须从父结点中删除 指向它的指针。父结点有三个指针,删除后, 还有两个指针,结点足够大。删除操作结束。
影响索引效率的因素: • 访问类型 • 访问时间 • 插入时间 • 删除时间 • 空间开销
搜索码(search key)
3.2 顺序索引
*主索引(Primary Index):
包含记录的文件按照某个搜索码指定顺序排列, 那么该搜索码对应的索引称为主索引。主索引也称 为聚集索引(Clustering Index) 。
通常情况下,主索引建在主码之上。
*辅助索引: 顺序与文件中记录的物理顺序不同的索引称
为 辅助索引(Secondary Index)或非聚集索引 (Nonclustering Index)
3.2.1 主索引:
文件按某个搜索码顺序存储。称这种在 某个搜索码上有主索引的文件为索引顺 序文件(index-sequential file)。
用N’.Km-1替换parent(N)中的K’
end else begin
令m满足(N’.Pm ,N’.Km)是N’中的最后一指针/值对 从N’中去除(N’.Pm ,N’.Km) 插 值入右(移N’使.P之m 成,为N’N.’K中m)的并第一通个指过针将和值其 他 指 针 和 用N’.Km替换parent(N)中的K’ end end else…与then的情况对称… end end
2.散列索引
3.6 动态散列
静态散列技术要求固定桶地址集合B,这存 在一个问题,大多数数据库都会随时间而变大, 要用静态索引,可以:
(1) 根据当前文件大小选择散列函数,性能随数据 库增大而下降。
(2) 根据将来某个时刻文件的大小选择散列函数, 初始时会造成空间浪费。
(3) 随文件增大,周期性对散列结构重组。重组时, 新的散列函数选择、记录重新散列。
插入时结点过大,要进行分裂,删
除时,结点过小要合并,只要这样才能 保B+树的平衡特性。
*插入: (1)结点不会过大,直接插入 (2)分裂结点,有n个码分裂
插入例子:
在前面的插入B+树中加入branch-name值为 “Clearview”的一条记录。按照查找算法, “Clearview”应出现在包含“Brighton”和 “Downtown”的结点中。该结点已经没有插入 “Clearview”的空间,因此该结点分裂为两个结点。 图12-12
算法: procedure delete(value K,pointer P) 找得包含(V,P)的叶结点L delete_entry(L,K,P)
procedure delete_entry(node N,value K,pointer P)
从N中删除(K,P) if(N是根且N只剩下一个子结点) then 使N的子结点成为新的树根结点并删除N else if(N值指针太少) then begin
4 B+树文件组织
B+树文件组织中,树叶结点中存贮 的是记录而不是指向记录的指针。
插入、删除同B+树索引一样 。 如图:
3.4 B树索引文件
B树索引和B+树索引相似。区别:B 树去除了搜索码值存贮中的冗余。B树允 许搜索码值只出现一次。
如图:
3.5 静态散列
1.散列文件组织
在散列文件组织中,通过计算所需记 录搜索码上的一个函数,直接获得包含该 记录的磁盘块地址。
3.3 . 1 B+树的结构
B+树索引是一个多级索引 (1)B+树结点结构
P1 K1 P2 … Pn-1 K n-1 P n
有n-1个搜索码K1 、K2 、…、Kn-1 ,n个 指针P1 、…、Pn 。 结点中码值有序存放:如果i<j ,则Ki < Kj 。
(2)具叶有结K点i 结的构一,个对文于件i记=1录,2,(…主,索n引-1。 文指件针按P照i 码指向值 存放)或指向一个指针桶(辅助索引),桶中 每针P个n 指指针向指下向一具个有叶码结值点K的i 头的指一针个。文这件记样可录以。将指 叶结点按照码值顺序串在一起,以便对文件进 行顺序处理。
插入双亲
procedure insert_in_parent(node N,value K’ ,node N’) if N是树的根结点 then begin 创建新结点R包含N, K’ ,N’ /* N和N’都是指针*/ 令为树的根结点 return end 令P=parent(N) if (P包含的指针小于n个) then 将(K’,N’)插入到P中N后面
(4)根结点:根结点的指针数可以小于n/2 。
除非整棵树只有一个结点,否则,根结点至少 有两个指针。完整的B+树。如图:
2 B+树上的查询
有两种方法: 一、从最小码值起顺序查找; 二、从根结点开始,进行随机查找。 随机查找:从根开始(查找长度小于
log n/2 k )。Байду номын сангаас
3.3 . 3 B+树的更新
• Trie 树的查找 • Trie 树的插入 • Trie 树的删除
2. Trie 树做索引 参考“数据结构” 清华大学 殷人昆等
(1) 可扩充散列,Fagin等[1979] 可扩充散列:
(a) 思想:当数据库增大或缩小时,可扩充 散列可以通过桶的分裂和合并来适应数 据库大小的变化。
(b) 好处:空间效率得以保持,每次重组仅 作用于一个桶上,时间开销也比较低。
重组是一项复杂、耗时的工作,重组时要禁止 对文件的访问。
动态散列:允许散列函数动态改变,以适 应数据库增大或缩小的需要。
1. Trie 树 当码是可变长时,Trie 树是一种特别有
用的索引结构。
Trie 树是一棵度大于等于2的树。它的 每一层分支不是由整个码值决定的,而 是由码值的一部分决定的。
insert_in_parent(L, K’, L’)
end
插入叶结点
procedure insert_in_leaf(node L,value K ,point P )
if(K<L.K1) then 把 P,K 插入L中,紧接在L.P1前面 else begin
令Ki表示L中小于K的最大搜索码值 把 P ,K 插入L中 ,紧接在T.Ki后面 end
叶结点中最多有n-1个码值,至少有 (n-1)/2 个码值,各叶结点中值地范围互不相交,即若 L值i 和都L小j 是于两Lj 个中叶的结所点有且码i值<j。,那么Li 中的所有码 要使B+树索引成为稠密索引,各码值必须出现 在叶结点中。
(3)B+树的非叶结点,形成叶结点上的一个 多级(稀疏)索引。对于i=2,3, …,n-1, 指针Pi 指向一棵子树,该子树中所有结 点的索引码值大于等于Ki-1 且小于Ki , Pn 指向的子树中所有码值大于等于Kn-1 , P1 指向子树中的所有码值均小于K1 。 非叶结点中至少有n/2个指针,最多有n 个,指针个数称为该结点的扇出。
在分裂结点后,必须将这个新结点加入B+树中, 新结点的最小搜索码值“Downtown”,需要将该搜 索码值插入到被分裂的结点的父结点中。由于父结 点中有插入搜索码值的空间,直接插入即可。图1212, 如果父结点也没有空间,那么父结点分裂。最
算法:
procedure insert(value K ,point P ) 找到应该包含值K的叶结点L if(L所含的搜索码少于n-1个)
else begin/* 分裂P*/ 将P复制到可以存放P以及(K’,N’)的内存块T中 把结点(K’,N’)插入T中紧跟在N后面 删除P中所有项;创建结点P’ 把 令TK.’’P=1,T….K,Tn/.2P| n/2| 复制到P 把T. Kn/2|+1 ,…,T. Pn+1复制到P’ insert_in_parent(P,K’’p’)
else 将N中所有(Ki ,Pi)对附加到N’中;置N’.Pn =N.Pn delete_entry(parent(N),K’,N);删除结点N
end
else begin/*重新分布:从N’借一个索引项*/
if (N是N’的前驱) then begin
if(N是非叶结点) then begin
令m满足N’.Pm 是N’的最后一个指针 从N’中去除(N’.Lm-1 , N’.Pm) 插入(N’,Pm ,K’)并通过将其他指针和值 右移使之成为N’中的第一个指针和值
桶――能存贮一条或多条记录的一个 存储单位。通常一个桶为一个 磁盘块,但也可能大于或小于 一个磁盘块。
K――码值集合。
B――桶地址集合。
H――从K到B的一个函数,称为散列函数。
插入ki 时,计算h(ki)得到存放该记录的桶地址。 查找ki 时,同样计算h(ki)。 删除:计算h(ki),找到ki 删除。 有时会出现:ki <>kj , h(ki)=h(kj)的情况,称为冲突。
图12-14
• 当要对叶结点的父结点删除时,父结点 本身可能会变的很小。如:我们要从图1214的B+树中删除“Perryridge”时发生。对 “Perryridge”的删除使一个叶结点变空。当
删除父结点中的指针时,父结点中只剩下一
个指针,合并结点。看它的兄弟结点(包含 一个搜索码Mianus的非叶结点)的情况。兄 弟结点有空间,因此合并两结点。图12-14。
适合对整个文件进行顺序处理又需要 对文件的单独记录进行随机访问的应用
1.稠密索引和稀疏索引 2.多级索引 3.索引的更新
插入:稠密索引 稀疏索引
删除:稠密索引 稀疏索引
3.2.2 辅助索引:
辅助索引必须是稠密索引,对每个搜索 码值都有一个索引项。
3.3 B+树索引文件
B+树是一个平衡的多叉树。 1. B+树的结构 2. B+树上的查询 3. B+树的更新 4. B+树文件组织
可以看到删除操作后根结点只有一个指针, 根结点也要被删除,整个B+树减少一层。
• 合并结点有时候也并不可行。如果从图 12-12的B+树中删除“Perryridge”,包含 “Perryridge”的结点删除为空,这个叶结点
的父结点仅剩一个指针,但是,这次却不
能与它的兄弟结点合并。解决的方法是重
新分布指针,使每个结点包含两个指针。 图12-16 。注意值的重新分布使两兄弟的父 结点中的搜索码值发生改变。
第三章 索引和散列
3.1 基本概念 3.2 顺序索引 3.3 B+树索引文件 3.4 B树索引文件 3.5 静态散列 3.6 动态散列 3.7 顺序索引和散列的比较 3.8 (略)SQL中的索引定义 3.9 多码访问
3.1 基本概念
• 顺序索引(ordered index):基于对值的一种排序 • 散列索引(hash index):用散列函数将值分布到若干个散列桶中。
令N’为parent(N)的前一子女或后一子女 令K’为parent(N)中指针N和N’之间的值 if (N和N’中的项能放在一个结点中) then begin /*合并结点*/
if(N是N’的前驱)then swap_variables(N,N’)
if(N是非叶结点)
then 将K’以及N中所有指针和值附加到N’中
相关文档
最新文档