用于内存数据库的Hash索引的设计与实现
hash存取方法

hash存取方法
Hash存取方法
一、什麼是Hash存取
Hash存取(Hash Access)是一種使用散列函數對資料採取存取方式的技術。
它是一種資料結構,它對數據進行雜湊操作,然後使用雜湊值去搜索某個鍵值,它也稱為散列表,使用雜湊表,我們可以對數據的讀取和寫入操作。
二、Hash存取的優點
1、查找速度快。
使用Hash存取方法,能夠快速搜尋指定的鍵值,由於每個鍵值都會先被雜湊,然後再使用雜湊值進行存取,所以能夠極大的加快搜尋的速度。
2、容易实现。
Hash存取的具體實現起來非常容易,大多數語言都有對應的Hash函數庫提供,所以對於開發者而言,可以快速的實現Hash存取。
3、查找安全性高。
Hash函數的輸出都是隨機的,而且輸入的參數只能夠在有限的範圍內,所以Hash存取方法具有很高的安全性,可以有效的防止攻擊者對數據進行破壞性的攻擊。
三、Hash存取的缺點
1、空間利用率低。
Hash存取方法使用了很多的空間來保存雜湊值,並且雜湊值只是個唯一的字符串,而沒有任何信息,所以導致存儲空間的利用率很低。
2、不能夠處理衝突。
Hash存取方法本身沒有办法解決兩個相同
的鍵值會導致的雜湊值衝突,因此如果使用Hash存取方法,必須很小心的設計雜湊函數,以免導致衝突問題。
hash模式的使用

hash模式的使用摘要:一、hash模式简介二、hash模式的使用方法1.创建hash对象2.添加数据3.查询数据4.删除数据5.更新数据三、hash模式的优点与局限性四、实战应用案例正文:hash模式是一种数据存储模式,通过键(key)值(value)对的形式将数据存储在hash对象中。
hash对象可以快速地添加、查询、删除和更新数据,因此在很多场景下都有着广泛的应用。
一、hash模式简介hash模式,又称散列表模式,是一种将数据存储在key-value对中的数据结构。
hash表通过哈希函数将key转换为索引,从而实现快速定位和访问value。
在这种模式下,数据存储和查找的时间复杂度均为O(1)。
二、hash模式的使用方法1.创建hash对象在使用hash模式之前,首先需要创建一个hash对象。
在大多数编程语言中,都有内置的hash对象,如Java中的HashMap,Python中的HashTable等。
以下是一个使用Python创建hash对象的示例:```pythonhash_obj = hashlib.md5()```2.添加数据创建hash对象后,可以使用以下方法向hash对象中添加数据。
在不同的编程语言中,方法可能略有不同。
以下是一个使用Python向hash对象添加数据的示例:```pythondata = "hello, world"hash_obj.update(data.encode("utf-8"))```3.查询数据要查询hash对象中的数据,可以使用以下方法。
以下是一个使用Python 查询hash对象数据的示例:```pythonvalue = hash_obj.hexdigest()```4.删除数据在hash对象中,数据是不可变的,因此无法直接删除。
但可以通过清空hash对象内的所有数据来实现删除效果。
以下是一个使用Python删除hash 对象数据的示例:```pythonhash_obj.clear()```5.更新数据要更新hash对象中的数据,可以将原有数据删除后,再重新添加新数据。
c实现的hash表-概述说明以及解释

c实现的hash表-概述说明以及解释1.引言1.1 概述在计算机科学中,哈希表(Hash Table),又被称为散列表,是一种常用的数据结构。
它能够以常数时间复杂度(O(1))来实现插入、删除和查找等操作,因此具有高效的特性。
哈希表通过哈希函数将键(key)映射到一个固定大小的数组(通常称为哈希表)。
通过这种映射关系,我们可以在数组中快速访问到对应的值(value)。
常见的应用场景包括缓存系统、数据库索引、编译器符号表等。
相对于其他数据结构,哈希表具有以下优点:1. 高效的插入、删除和查找操作:哈希表在插入、删除和查找数据时以常数时间复杂度进行操作,无论数据量大小,都能快速地完成操作。
2. 高效的存储和检索:通过哈希函数的映射关系,哈希表能够将键值对存储在数组中,可以通过键快速地找到对应的值。
3. 空间效率高:哈希表通过哈希函数将键映射到数组下标,能够充分利用存储空间,避免冗余的存储。
然而,哈希表也存在一些局限性:1. 冲突问题:由于哈希函数的映射关系是将多个键映射到同一个数组下标上,可能会导致冲突。
解决冲突问题的常见方法包括链地址法(Chaining)和开放定址法(Open Addressing)等。
2. 内存消耗:由于哈希表需要维护额外的空间来存储映射关系,所以相比于其他数据结构来说,可能会占用较多的内存。
本篇长文将重点介绍C语言实现哈希表的方法。
我们将首先讨论哈希表的定义和实现原理,然后详细介绍在C语言中如何实现一个高效的哈希表。
最后,我们将总结哈希表的优势,对比其他数据结构,并展望哈希表在未来的发展前景。
通过本文的学习,读者将能够深入理解哈希表的底层实现原理,并学会如何在C语言中利用哈希表解决实际问题。
1.2 文章结构本文将围绕C语言实现的hash表展开讨论,并按照以下结构进行组织。
引言部分将对hash表进行概述,介绍hash表的基本概念、作用以及其在实际应用中的重要性。
同时,引言部分还会阐述本文的目的,即通过C语言实现的hash表,来探讨其实现原理、方法以及与其他数据结构的对比。
数据库中的索引设计技巧

数据库中的索引设计技巧索引是数据库中的一种非常重要的对象,它可以大大提高数据库的查询效率。
但是,如果设计不当,索引也会成为数据库性能的瓶颈。
本文将介绍一些数据库中的索引设计技巧,以帮助你充分利用索引提高数据库的性能。
一、选择正确的索引类型在数据库中,常见的索引类型包括B树索引、哈希索引和全文索引等。
在选择索引类型时,需要根据实际情况进行综合考虑。
B树索引适合处理范围查询和排序等操作。
如果查询语句涉及到范围查询、排序等操作,建议采用B树索引。
但是,由于B树索引需要时时刻刻保持平衡,因此在更新频繁的情况下,B树索引的性能可能会受到影响。
哈希索引适合处理等值查询。
哈希索引可以将索引值映射到一个固定长度的地址上,因此查询性能非常高。
但是,哈希索引无法支持范围查询、排序等操作。
全文索引适合处理文本查询。
全文索引可以建立在文本列上,可以支持模糊查询、语义查询等操作。
但是,全文索引的构建比较复杂,而且需要消耗更多的存储空间。
二、为重要的列创建索引在数据库中,有些列比其他列更加重要。
比如,主键列、外键列、经常用于查询的列等。
对于这些重要的列,建议创建索引,以提高查询性能。
在创建索引时,需要考虑索引的选择性。
选择性是指该列中不同的值占总行数的比例。
如果选择性太低,即不同的值很少,那么建立索引的效果可能不太好。
因此,建议选择具有较高选择性的列创建索引。
三、合理地使用组合索引组合索引是由多个列组成的索引,可以提高多列联合查询的效率。
但是,在使用组合索引时需要注意以下几点:1.列的顺序应该合理。
首先要考虑经常使用的列,然后再考虑其他列。
如果经常使用的列放在后面,可能会失去索引的效果。
2.组合索引中的列数不能太多。
组合索引中的列数越多,索引树的深度越大,查询效率也就越低。
3.组合索引不一定比单列索引好。
有时候,单列索引也可以满足查询的需求,而且更加简单、易于维护。
四、定期重新建立索引在数据库中,添加、删除、修改等操作都会影响索引的性能。
c语言hash用法

c语言hash用法一、概述Hash是一种常用的数据结构,用于将任意长度的数据映射到固定长度的数据中。
在C语言中,可以使用hash来实现数据的快速查找和插入操作。
Hash算法的原理是将数据通过一系列函数映射到一个固定长度的哈希值,从而实现对数据的快速查找和插入。
二、hash的实现方式在C语言中,常用的hash实现方式有线性探测和平方探测等。
线性探测是指在查找失败时,顺序地检查已存在的哈希链中的下一个元素,直到找到空位或者遍历完整个哈希链。
平方探测是指当哈希值碰撞时,检查该碰撞点后面的位置,如果没有冲突则直接插入,否则进行链式存储。
三、hash的使用步骤1. 定义哈希表结构体和哈希函数首先需要定义哈希表结构体,包括存储数据的数组和哈希函数等。
哈希函数的作用是将输入的数据映射到哈希表中存储的位置。
常用的哈希函数有直接平方取余法、除法取余法等。
2. 初始化哈希表在使用hash之前,需要将哈希表进行初始化,即创建一个空的数组并分配相应的内存空间。
3. 插入数据将需要插入的数据通过哈希函数映射到哈希表中存储的位置,并将数据存储在该位置。
如果该位置已经存在数据,则需要根据具体的哈希算法进行处理,例如进行链式存储等。
4. 查找数据根据需要查找的数据通过哈希函数映射到哈希表中存储的位置,并检查该位置是否存储了需要查找的数据。
如果找到了需要查找的数据,则返回该数据的指针;否则返回空指针。
5. 删除数据根据需要删除的数据通过哈希函数映射到哈希表中存储的位置,并执行相应的删除操作。
四、hash的优缺点Hash的优点包括:1. 插入和查找速度快:由于哈希表使用的是数组结构,因此可以在O(1)时间内完成插入和查找操作。
2. 空间利用率高:哈希表使用链式存储时,可以有效地利用空间,避免出现数据重叠的情况。
然而,Hash也存在一些缺点:1. 冲突概率:由于哈希函数的不确定性,可能会出现数据碰撞的情况。
如果碰撞过多,则需要使用链式存储等方法进行处理。
数据结构的散列与索引技术

数据结构的散列与索引技术散列与索引技术是数据结构中常用的两种方法,用于优化数据的存储和查找过程。
散列技术是通过哈希函数将数据映射到一个固定长度的数组中,而索引技术是通过建立索引表来加速数据检索。
本文将详细介绍散列与索引技术的原理、应用场景以及其在实际开发中的使用方法。
1. 散列技术散列技术是一种将数据映射到哈希表的方法,通过哈希函数将关键字转化为一个数组中的地址,从而实现对数据的快速访问。
散列技术的核心是哈希函数的设计,一个好的哈希函数能够使数据均匀地散列到哈希表中,尽量避免碰撞(即不同的关键字映射到了同一个地址)的发生。
1.1 哈希函数的设计原则一个好的哈希函数应该满足以下几个原则:1.1.1 均匀性原则:哈希函数应能够将数据均匀地散列到哈希表中,避免碰撞的发生。
1.1.2 简单性原则:哈希函数的计算应简单快速,以提高散列效率。
1.1.3 一致性原则:对于相同的关键字,哈希函数应始终返回相同的散列地址。
1.1.4 随机性原则:哈希函数的输出应具有随机性,避免出现特定模式的散列结果。
1.2 常见的散列方法常见的散列方法包括直接定址法、除留余数法、平方取中法等。
除留余数法是最常用的散列方法之一,其思想是通过对关键字取余数来获取散列地址。
例如,对于一个哈希表的大小为n的散列表,哈希函数可以定义为:h(key) = key % n。
2. 索引技术索引技术是建立索引表来加速数据的检索过程。
索引表通常由键值和指向数据的指针组成,可以根据键值快速地查找到对应的数据记录。
索引技术的核心是索引表的设计,索引表的结构应具有高效的查找和更新操作。
2.1 主索引与辅助索引主索引是基于主关键字建立的索引表,通过主索引可以直接找到对应的数据记录。
辅助索引是基于其他非主关键字建立的索引表,通过辅助索引可以加速对数据的查询和过滤操作。
主索引和辅助索引的组合可以构建复杂的索引结构,以满足不同的查找需求。
2.2 B树索引B树是一种常用的平衡多路查找树,广泛应用于数据库系统中的索引结构。
哈希 数据结构
哈希数据结构哈希(Hash)数据结构是一种常用的数据结构,它在计算机科学领域被广泛应用。
哈希数据结构的主要特点是能够快速地进行数据查找和插入操作,具有高效的时间复杂度。
一、哈希数据结构的定义和原理哈希数据结构是一种将数据元素与索引值建立映射关系的数据结构。
它通过将数据元素经过哈希函数的计算得到对应的索引值,从而将数据元素存储在数组中的相应位置。
在哈希数据结构中,哈希函数起到了关键的作用,它能够将任意大小的数据映射为固定大小的索引值。
常见的哈希函数有散列函数、MD5、SHA等。
二、哈希数据结构的应用1. 数据存储和检索:哈希数据结构可以将数据元素按照一定的规则进行存储,从而实现快速的数据检索。
例如,在散列表中,通过哈希函数将关键字映射为索引值,就可以快速地找到对应的数据。
2. 缓存管理:哈希数据结构可以用于缓存管理,可以将频繁访问的数据存储在哈希表中,以提高数据的访问速度。
例如,在操作系统中,页面置换算法中的最近最少使用(LRU)算法就可以使用哈希表来实现。
3. 数据完整性校验:哈希数据结构可以用于数据完整性校验,通过对数据进行哈希运算,得到一个唯一的哈希值,用于校验数据是否被篡改。
例如,在文件传输过程中,可以对文件进行哈希运算,将哈希值与接收到的文件进行比较,以确保文件的完整性。
4. 密码存储:哈希数据结构可以用于密码存储,通过将密码进行哈希运算,将哈希值存储在数据库中,可以提高密码的安全性。
例如,在用户注册过程中,可以对用户密码进行哈希运算,将哈希值存储在数据库中,而不是明文存储用户密码。
三、常见的哈希数据结构1. 散列表(Hash Table):散列表是一种以键值对形式存储数据的数据结构,它使用哈希函数将关键字映射为索引值,将数据存储在数组中的相应位置。
散列表具有快速的查找和插入操作的特点,广泛应用于各种编程语言中。
2. 哈希集合(Hash Set):哈希集合是一种集合数据结构,它使用哈希函数将元素映射为索引值,将元素存储在数组中的相应位置。
哈希算法的基本原理和优化方法
哈希算法的基本原理和优化方法哈希算法是一种将数据映射到固定长度的唯一哈希值的算法。
它的基本原理可以用一句话来概括:对于给定的输入,哈希算法会生成一个固定长度的哈希值,该哈希值是唯一且不可逆的,即无法从哈希值推导出原始输入。
在实际应用中,哈希算法有很多优化方法,下面就给出一些常见的优化方法。
第一个优化方法是分离哈希函数和哈希表。
哈希表是哈希算法的核心数据结构,用于存储哈希值与实际数据的映射关系。
在大规模数据存储的情况下,哈希表可能需要占用较大的内存空间。
为了避免频繁的内存申请和释放,可以将哈希函数和哈希表分离开来,将哈希函数计算的结果作为索引,定位到哈希表对应的位置,然后在该位置上进行数据的存取。
第二个优化方法是选择合适的哈希函数。
哈希函数的选择直接影响到哈希算法的性能。
一个好的哈希函数应该能够使得不同输入的哈希值分布均匀,避免冲突。
常见的哈希函数包括MD5、SHA-1等。
在实际应用中,可以根据具体需求选择合适的哈希函数。
第三个优化方法是处理哈希冲突。
由于哈希函数的输出空间一般要远远小于输入空间,所以不同的输入可能会产生相同的哈希值,这就是哈希冲突。
处理哈希冲突的方法有很多,常见的有链地址法和开放地址法。
链地址法将哈希冲突的元素组织成链表,每个链表对应一个哈希值;开放地址法则是遇到冲突时,顺序地查找下一个可用位置。
选择合适的处理冲突的方法可以提高哈希算法的效率。
第四个优化方法是使用布隆过滤器。
布隆过滤器是一种空间效率非常高的概率型数据结构,用于快速检索一个元素是否存在于大规模数据集中。
它利用多个哈希函数和一个位数组来判断一个元素是否存在,可以有效地降低哈希冲突的概率。
第五个优化方法是使用哈希碰撞检测技术。
哈希碰撞检测技术可以检测到哈希函数的冲突概率是否过高,从而及时采取措施来避免哈希表的溢出。
一种常见的哈希碰撞检测技术是使用二次哈希函数,即在哈希函数之后再进行一次哈希操作,使得冲突的概率进一步降低。
哈希存储的原理
哈希存储的原理哈希存储是一种常见的数据存储和检索方式,其基本原理是通过哈希函数将数据映射到一个固定大小的数据结构中,从而实现快速的数据查找和插入操作。
哈希存储在计算机科学和工程领域中被广泛应用,比如大规模数据存储系统、Web 服务器、分布式缓存等领域。
哈希函数是哈希存储的核心,它将输入值(比如字符串、整数等)映射为一个固定大小的输出值,并且具有以下特点:1. 一致性:对于同一个输入值,哈希函数总是返回相同的输出值;2. 均匀性:哈希函数的输出值应该在输出空间中均匀分布,从而避免冲突(多个输入值映射到同一个输出值);3. 单向性:哈希函数通常是单向的,即从哈希值无法推导回原始输入值。
在哈希存储中,常见的数据结构有哈希表、哈希集合、哈希映射等,它们都采用哈希函数将输入值映射到桶(bucket)中,实现快速的插入、查找和删除操作。
桶是一个存储数据的容器,通常是一个数组或链表。
当多个输入值被映射到同一个桶时,就会发生哈希冲突。
常见的解决哈希冲突的方法有以下几种:1. 链表法:将多个输入值映射到同一个桶中,使用链表来存储这些数据。
这种方法简单易用,但是随着链表长度的增加,性能会逐渐下降;2. 线性探测法:当哈希冲突发生时,顺序查找下一个可用的桶,直到找到一个空桶或者桶已满。
这种方法相对于链表法可以减少内存消耗,但是容易出现聚集现象(多个输入值映射到相邻的桶中);3. 双散列法:使用不同的哈希函数来处理冲突,从而尽量避免冲突。
这种方法可以提高哈希表的性能和稳定性,但是需要额外的计算量和空间消耗。
哈希存储的优点在于快速的插入、查找和删除操作,其时间复杂度可以达到O(1)(最坏情况下为O(n))。
因此,哈希存储被广泛应用于网络分布式系统、数据库、缓存等应用中。
但是,哈希存储也存在一些缺点,比如:1. 哈希函数的设计难度较大,需要考虑数据分布的均匀性;2. 哈希冲突会导致性能下降,需要采用解决哈希冲突的方法;3. 哈希存储对于数据的删除和修改操作较复杂,需要特殊处理。
oracle创建hash索引的语句
一、概述在Oracle数据库中,可以通过使用CREATE INDEX语句创建hash 索引。
hash索引是一种特殊的索引类型,它通过将索引列的值经过散列函数计算,将计算得到的散列值与对应的行存储在索引中。
相比于传统的B-tree索引,hash索引在某些特定场景下有着更好的性能表现。
接下来,我们将介绍在Oracle数据库中创建hash索引的语法和使用方法。
二、语法在Oracle数据库中,使用CREATE INDEX语句创建hash索引的语法如下所示:```SQLCREATE INDEX index_nameON table_name (column_name)TABLESPACE tablespace_nameHASHKEYS hash_key_number;```其中,各个参数的含义如下:- index_name:指定要创建的索引的名称。
- table_name:指定要在哪张表上创建索引。
- column_name:指定要创建索引的列名。
- tablespace_name:指定索引所在的表空间。
- hash_key_number:指定散列桶的数量。
三、示例下面我们通过一个具体的示例来演示如何在Oracle数据库中创建hash索引。
假设我们有一个名为employee的表,其中包含了id和name两个字段。
我们希望为name字段创建一个hash索引,语句如下:```SQLCREATE INDEX name_indexON employee (name)TABLESPACE index_tablespaceHASHKEYS 100;```在这个示例中,我们为employee表的name字段创建了一个名为name_index的hash索引,该索引存储在index_tablespace表空间中,并且指定了100个散列桶。
四、注意事项在使用CREATE INDEX语句创建hash索引时,需要注意以下几点:1. 散列桶数量的选择:散列桶的数量直接影响了hash索引的性能,通常情况下应该选择一个合适的值来平衡索引的分布和查询性能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
技术的缺点就是不同的关键词有可能冲突,即key1 ≠ key2,
但是H(key1)=H(key2),其中,key1和key2称为同义词。在Hash
作者简介:袁培森(1980-),男,硕士,主研方向:数据库和数据挖 掘;皮德常,博士、副教授 收稿日期:2006-12-28 E-mail:peiseny@
p*sizeof(HashEntry) +C*4
—70—
2.4 Hash 索引的算法 2.4.1 插入索引项算法
向表中插入记录时,为此记录分配一个记录号,在索引 中插入索引项算法如下:
输入 pIDX /*指向索引的指针*/
TupKey /*记录关键词*/
TupNo /*待插入的记录号*/
步骤如下:
(1) 由 关 键 词 TupKey 和 哈 希 函 数 生 成 哈 希 值 , 记 为 h=Hash(TupKey);在冲突桶中 TupNo 对应的位置记为 CurPos;
Hash技术在信息系统的数据存储与访问中占有重要的地 位[7,8]。它把关键词直接映射为存储地址,达到快速寻址的目 的,即Addr=H(key),其中key为关键词;H为哈希函数。文献 [4,5] 讨 论 了 几 种 常 用 的 哈 希 函 数 : (1) 除 留 余 数 法 (Division Method),H(key)=key MOD p,p一般为质数;(2)随机数法 (Random Method),H(key)=random(key),random为随机函数; (3)平方取中法(Midsquare Method)。
系统为哈希索引建立 2 个空间:(1)模值空间 HashEntry, 即哈希入口;(2)冲突空间 ConBulk,冲突空间存储冲突关键 词的记录的指针。
哈希索引入口数据结构如下:
struct {
unsigned long Entry;
unsigned long Depth;
} HashEntry;
其中,Entry 为哈希入口的记录号;Depth 为冲突链的深度。 在哈希索引中,哈希函数最常用除留余数法为
第 33 卷 第 18 期 Vol.33 No.18
计算机工程 Computer Engineering
2007 年 9 月 Septem编号:1000—3428(2007)18—0069—03 文献标识码:A
中图分类号:TP311
用于内存数据库的 Hash 索引的设计与实现
While(DelPos!=TupNo)
{ Ptr=&ConBulk[DelPos-1];
DelPos=ConBulk[DelPos-1]; } (3)找到待删除的记录号,在冲突链中的位置为 DelPos;把后面 的链上*Ptr=ConBulk[DelPos-1];把记录号对应的冲突链位置置为 0; 冲突链深度减 1; (4)成功返回 TRUE,失败返回 FALSE。
2 内存数据库 Hash 索引设计
2.1 内存数据库设计思想 电信网管数据库系统是电信底层支撑系统,它不仅要求
数据库能够“实时”、“近实时”地处理数据,而且系统需有 很高的稳定性,为了保证系统高稳定性,内存数据库表的容 量是规划好的,表采用一次性静态进行连续分配。这样做的 优点是方便数据在内外存间进行换入换出;也可以通过相对 地址访问记录。表的记录存放在内存中,每条记录分配一个 指针(4B 的记录号,称为伪指针)指向它。
∀ T∈ AT(t), Dt(T) ⊆ DBM(t)
成立,则称DBS为一个MMDBS[1]、DB为MMDB。内存数据 库实质就是将数据库的“工作版本”存放在内存中。
内存按字或字节存储,通过指针访问。磁盘是以数据块 形式进行存储。由于内存和磁盘的存储方式的差别,因此内 存数据库的数据结构的设计与DRDB差别很大。磁盘以块寻 址,数据连续存放可以减少磁盘的寻道时间;内存是以字或 字节形式存储,并通过指针进行访问,时间开销与存放方式 基本无关。内存数据库一般是通过指针访问数据库中的记 录[4~6]。
【Abstract】Telecom has became a data-intensive industry, which enlists the support of high performance database. Disk-resident database(DRDB) can’t satisfy the demand of real-time or nearly real-time performance, so to design a kind of new database system, in which "core data" reside in main memory is considered, is needed. Hash index technique is a kind of index technique, used in database system, which can quickly access data, easy to design and implement. According to the features of main memory database, this paper designs and implements a kind of Hash index used in telecom network’s main memory database system. 【Key words】MMDB; Hash index; disk-resident database(DRDB)
随着应用的发展,由于“I/O瓶颈”问题,基于磁盘的数 据库系统(DRDBS)不能满足现代应用对数据库的实时性处理 的要求。如电信网管系统、电话交换机的实时呼叫处理、移 动通信HLR/VLR等系统,它们需要实时地对数据进行处理。 基于磁盘的数据库系统(Oracle,SQL server等),不能满足实时 性需求。内存数据与磁盘数据在访问时间上相差 5 个数量 级[1],内存的速度具有明显的优势。内存容量增大,而价格 却在不断地下降[2,3]。从 20 世纪 80 年代开始,数据库研究人 员考虑把整个或者大部分数据库放在内存中。内存数据库 (MMDB)是实时数据库研究的基础,并成为了研究的热点。
—69—
技术中,冲突是不可避免的,只能减少冲突的概率[8]。处理 冲突的方法分两大类[7]:开放地址法(open addressing)和独留 链(separate chaining)。当出现冲突时,开放地址法通过试探 性地增加一定的值,把冲突的关键词放到一个空闲位置;独 留链法把冲突的关键词存储到一个线性链表中。
1 内存数据库和 Hash 索引
1.1 内存数据库 内存数据库就是把整个或部分数据库放在内存中。内存
数据库的定义为:设有数据库系统DBS,DB为DBS中的数据
库,DBM(t)为在时刻t,DB在内存的数据集,DBM ⊆ DB。
TS为DBS中所有可能事务的集合,AT(t)为在时刻t处于活动状
态的事务集,AT(t) ⊆ TS。Dt(T)为事务T在t时刻所操作的数据 集,Dt(T) ⊆ DB。若任意时刻t,均有
袁培森,皮德常
(南京航空航天大学信息科学与技术学院,南京 210016)
摘 要:电信领域已成为数据密集型行业,需要高性能的数据库系统作为支撑系统,基于磁盘的数据库系统不能满足“实时”、“近实时”访 问数据库的需求,将数据库核心数据驻留在内存中,可以使用内存数据库来满足需求。Hash 索引是数据库系统中广泛使用的索引技术之一, 它能够快速地访问数据,易于设计和实现。该文根据内存数据库的特点,为电信网管系统的内存数据库设计并实现了 Hash 索引。 关键词:内存数据库;Hash 索引;磁盘数据库系统
(1) 由 关 键 词 TupKey 和 哈 希 函 数 生 成 哈 希 值 , 记 为 h=Hash(TupKey);模值空间 h 处哈希入口记录号记为 DelPos;
(2)考虑待删除的记录是否等于入口处的记录。是,则把 TupNo 在冲突桶中对应的记录号放在“h 在模值空间的入口处”,TupNo 对 应的冲突空间位置置 0,冲突链深度减 1;否,则遍历冲突链:
H(key)=key MOD p
文献[7]说明了此方法是哈希函数中最好的。根据经验, p=(C/4)*2+13 比较好,既节省了的内存空间,又减少了冲突 的概率。 2.3 冲突的处理
索引的冲突处理是实现的关键,为每一张表的索引分配 与其表容量 C 相等的冲突空间,由 ConBulk 指向关键词冲突 的记录,根据指针(记录号)链接成一条静态链。例如记录号 为 7、5、3 的记录关键词冲突,ConBulk6、4、2 处的位置分 别存储 5、3、0,其中 0 表示静态链尾,这样就把冲突的关 键词链接起来。由于表的容量是规划好的,并且指针的空间 很小,因此可一次分配 C 大小的冲突空间,这样哈希索引不 必动态地分裂。冲突桶的大小为 C 大小的指针空间,每一个 指针为 4 倍,每张表的索引占的总空间为
使用指针的优点是:通过指针可以方便地获得记录的字 段值;当更新记录时移动指针比移动记录的属性值快捷,并 且降低了空间开销。当插入记录时,为此记录分配一个记录 号,每张表的最大容量为 232。设表中的容量为C,则指针占 (4*C)B的空间。 2.2 内存数据库 Hash 索引的设计
为了快速地定位数据库的记录,数据库系统设计了多种 形式的索引,内存数据库也要建立索引。数据库中广泛使用 的哈希索引有链接桶哈希(chained bucket hashing)、可扩展哈 希(extendible hashing)、线性哈希(linear hashing)、修正的线 性哈希(modified linear hashing)[5],其中链接桶的哈希使用静 态结构处理冲突,速度很快,但不适合动态环境。基于等值 的比较,哈希技术能够快速地访问数据库,且易于实现,但 不支持范围检索。网管数据库一般不涉及范围的检索,更新 却非常频繁,因此,系统适合采用哈希索引。