- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
思考mysql内核之初级系列7---innodb的hash表实现
思考mysql内核之初级系列7---innodb的hash表实现
在上一篇里面,bingxi和alex谈到了文件系统管理,在结构体里面出现了两个常用的结构:hash_table_t、UT_LIST_NODE_T。这两个结构比较常用,在本篇里面,bingxi和alex聊了下关于hash_table_t的内容。
对应的文件为:
D:\mysql-5.1.7-beta\storage\innobase\ha\hash0hash.c
D:\mysql-5.1.7-beta\storage\innobase\include\hash0hash.h
1)常用结构体
Bingxi:“alex,我们今天聊下hash表,所谓hash表,常用的就是通过key,然后取模然后丢到相应的bucket里面。假设bucket的数量是13个,key值对应的bucket就是key%13,相同bucket值的放在一个链表里面。这里需要注意一点的是,1和27具有相同的bucket值,会放在同一个bucket里面,因此查找的时候,首先找到对应的桶(bucket),然后对该桶的链表进行遍历,每个成员里面记录了原始的key,1对应的结构里面有一个字段表示1,27对应的一个结构里面有一个字段表示27,这样就能找到对应的成员。
”
alex:“嗯,是的,bingxi。我们来看下hash表结构。同样地,我们将结构定义的其他元素先忽略,直接看其中的主要成员。如果需要了解其它的成员,则推荐设置debug断点进行调试。
/* The hash table structure */
struct hash_table_struct {
……
ulint n_cells; //hash表的成员数量,也可以称为bucket的数量
hash_cell_t* array; //指向桶的数组
……
};
结构中,就是成员的数量,以及一个数组。因为使用hash表的结构是多种多样的,比如前几篇文章中提到过的buf_pool_t、fil_system_t。这两者都使用到了hash,并且成员结构不一样。对于每个桶对应的指针类型是不确定,因此bucket中记录的指针是void*类型的。
struct hash_cell_struct{
void* node; /* hash chain node, NULL if none */
};
”
Bingxi:“alex,是这样的,这里带来两个问题:1、hash表的n_cells是个素数用于做模操作,在创建的时候提供一个准确的素数是有难度的,2、对应整型的key可以通过key%n_cells的方法来获得对应的桶,那么对于字符串型的如何处理?
”
Alex:“嗯,好吧。在说这两个问题之前,我们先看下hash表的创建过程。我们在函数fil_system_create如下面所示的行中设置一个断点。
system-spaces = hash_create(hash_size); //在此行设置断开
system-name_hash = hash_create(hash_size);
然后启动mysql,执行到该断点处我们可以发现对应的hash_size为50。F11进入该函数体,看看具体是怎么执行的。
/*****************************************************************
Creates a hash table with = n array cells. The actual number of cells is
chosen to be a prime number slightly bigger than n. */
hash_table_t*
hash_create(
/*========*/
/* out, own: created table */
ulint n) /* in: number of array cells */
{
hash_cell_t* array;
ulint prime;
hash_table_t* table;
ulint i;
hash_cell_t* cell;
//在该例中,我们根据输入值50(n的取值),得到一个素数151
prime = ut_find_prime(n);
table = mem_alloc(sizeof(hash_tabl
您可能关注的文档
最近下载
- DB41T 2412-2023 高标准农田建设规范.docx VIP
- DB11_T 387.1-2016 水利工程施工质量评定 第1部分:河道整治.PDF VIP
- IPC-1602-CN:2020+印制板操作和储存标准+-+完整中文电子版(36页).pdf VIP
- 肝病相关血小板减少症临床管理中国专家共识2023解读.pptx VIP
- 夏枯草种植技术规程.pdf VIP
- 【室内装修施工组织设计】.docx VIP
- 生物物理学导论-08省名师优质课获奖课件市赛课一等奖课件.ppt VIP
- DB41_T 2416-2023 高标准农田 智慧灌溉技术规程.docx VIP
- 棉纺织生产工艺流程大全.pdf VIP
- 生物物理学课件.docx VIP
文档评论(0)