- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
25-Hash索引的底层原理是什么?25-Hash索引的底层原理是什么?
我们上节课讲解了B+树的原理,今天我们来学习下Hash的原理和使⽤。Hash本⾝是⼀个函数,⼜被称为散
列函数,它可以帮助我们⼤幅提升检索数据的效率。打个⽐⽅,Hash就好像⼀个智能前台,你只要告诉它
想要查找的⼈的姓名,它就会告诉你那个⼈坐在哪个位置,只需要⼀次交互就可以完成查找,效率⾮常⾼。
⼤名⿍⿍的MD5就是Hash函数的⼀种。
Hash算法是通过某种确定性的算法(⽐如MD5、SHA1、SHA2、SHA3)将输⼊转变为输出。相同的输⼊永
远可以得到相同的输出,假设输⼊内容有微⼩偏差,在输出中通常会有不同的结果。如果你想要验证两个⽂
件是否相同,那么你不需要把两份⽂件直接拿来⽐对,只需要让对⽅把Hash函数计算得到的结果告诉你即
可,然后在本地同样对⽂件进⾏Hash函数的运算,最后通过⽐较这两个Hash函数的结果是否相同,就可以
知道这两个⽂件是否相同。
Hash可以⾼效地帮我们完成验证的⼯作,它在数据库中有⼴泛的应⽤。今天的课程主要包括下⾯⼏个部
分:
1. 动⼿写程序统计⼀下Hash检索的效率。
2. 了解MySQL中的Hash索引,理解使⽤它的优点和不⾜。
3. Hash索引和B+树索引的区别以及使⽤场景。
动⼿统计Hash检索效率
动⼿统计Hash检索效率
我们知道Python的数据结构中有数组和字典两种,其中数组检索数据类似于全表扫描,需要对整个数组的
内容进⾏检索;⽽字典是由Hash表实现的, 的是key-value值,对于数据检索来说效率⾮常快。
对于Hash的检索效率,我们来个更直观的认知。下⾯我们分别看⼀下采⽤数组检索数据和采⽤字典
(Hash)检索数据的效率到底有怎样的差别。
实验1:在数组中添加10000个元素,然后分别对这10000个元素进⾏检索,最后统计检索的时间。
代码如下:
import time
# 插⼊数据
result = []
for i in range(10000):
result.append(i)
# 检索数据
time_start=time.time()
for i in range(10000):
temp = result.index(i)
time_end=time.time()
print(检索时间, time_end-time_start)
运⾏结果:
检索时间为1.2436728477478027秒
实验2:采⽤Hash表的形式 数据,即在Python中采⽤字典⽅式添加10000个元素,然后检索这10000个
数据,最后再统计⼀下时间。代码如下:
import time
# 插⼊数据
result = {}
for i in range(1000000):
result[i] = i
# 检索数据
time_start=time.time()
for i in range(10000):
temp = result[i]
time_end=time.time()
print(检索时间:,time_end-time_start)
运⾏结果:
检索时间为0.0019941329956054688秒。
你能看到Hash⽅式检索差不多⽤了2毫秒的时间,检索效率提升得⾮常明显。这是因为Hash只需要⼀步就
可以找到对应的取值,算法复杂度为O(1),⽽数组检索数据的算法复杂度为O(n)。
MySQL中的Hash索引
MySQL中的Hash索引
采⽤Hash进⾏检索效率⾮常⾼,基本上⼀次检索就可以找到数据,⽽B+树需要⾃顶向下依次查找,多次访
问节点才能找到数据,中间需要多次I/O操作,从效率来说Hash⽐B+树更快。
我们来看下Hash索引的⽰意图:
键值key通过Hash 找到桶bucket。在这⾥桶(bucket)指的是⼀个能 ⼀条或多条 的 单
位。⼀个桶的结构包含了⼀个内存指针数组,桶中的每⾏数据都会指向下⼀⾏,形成链表结构,当遇到
Hash 时,会在桶中进⾏键值的查找。
那么什么是Hash 呢?
如果桶的空间⼩于输⼊的空间,不同的输⼊可能会 到同⼀个桶中,这时就会产⽣Hash ,如果Hash
的量很⼤,就会影响
文档评论(0)