原创有误请指出:
版本:5.7.14
源码位置为hash0hash.h hash0hash。cc
作为一种时间复杂度最优为O(1)的数据结构,但是最坏时间复杂对位O (n)的一种数据结构,但是在
良好的设计哈希函数的情况下性能还是非常好的。关于哈希表的图在最后给出。在innodb中各种数据
结构都使用哈希表查找比如LOCK_T结构,还有我们特别熟悉的自适应哈希索引等,等下面我们进行一些
探讨。
一,innodb哈希函数
首先我们不得不研究一下innodb的哈希函数,哈希函数的设计至少有2个要求
1,计算简单,否则如果计算花费了太多时间你的哈希查找表也是不成功的
2,计算能够尽可能的分散值
那么innodb是如何设计这个哈希函数的呢?很简单如下:
细胞(桶数量)进行取模操作,非常简单实用。
二,处理冲突
哈希表避免不了冲突,而数据库中往往也利用这一点,将多个链表合并起来,innodb当然也就采用了
链表的方式来处理冲突。那么言外之意每一个数据结构中必须包含一个如普通链表中data_struct *下
的指针,当然这里也可以用void *泛型指针,我们来看看lock_t结构体中:
hash_node_t散列;/* ! & lt;哈希链的节点记录锁*/
确实如此。这也是单项链表实现的基础。
三、哈希表头
一个哈希表当然需要一个哈希表头这个表头指向了具体的细胞数组(内存相似但在堆空间不再栈上),
innodb中如下,我去掉了一些用处不大的:
一个元素void *。
具体单元的地址了,后面的只是地址指针+ +就可以了。那么我们user_str也至少包含这样一个
hash_table_t *的指针来指向整个哈希表,确实如此在innodb lock_sys_t中包含了
hash_table_t * rec_hash
那么我们可以lock_sys_t和lock_t为列子画一张展示图如下:
MYSQL INNODB中哈希查找表的实现
版本:5.7.14
源码位置为hash0hash.h hash0hash。cc
作为一种时间复杂度最优为O(1)的数据结构,但是最坏时间复杂对位O (n)的一种数据结构,但是在
良好的设计哈希函数的情况下性能还是非常好的。关于哈希表的图在最后给出。在innodb中各种数据
结构都使用哈希表查找比如LOCK_T结构,还有我们特别熟悉的自适应哈希索引等,等下面我们进行一些
探讨。
一,innodb哈希函数
首先我们不得不研究一下innodb的哈希函数,哈希函数的设计至少有2个要求
1,计算简单,否则如果计算花费了太多时间你的哈希查找表也是不成功的
2,计算能够尽可能的分散值
那么innodb是如何设计这个哈希函数的呢?很简单如下:
点击()折叠或打开
-
<李>
李>
<李>
ut_hash_ulint
李> <李>
李> <李> ulint ,,, key ,,,价值是散列
李> <李> ulint ,,, table_size ,,,哈希表大小
李> <李>
李> <李> ut_adtable_size
李> <李> 关键关键^ UT_HASH_RANDOM_MASK2
李> <李> returnkey table_size
李> <李> 李>
点击()折叠或打开
-
<李>
李>
<李>
hash_calc_hash
李> <李>
李> <李> ulint ,,, fold ,,,折叠价值
李> <李> hash_table_t ,,, table ,,,哈希表
李> <李>
李> <李> ut_adtable
李> <李> ut_adtablemagic_n HASH_TABLE_MAGIC_N
李> <李> returnut_hash_ulintfold tablen_cells
李> <李> 李>
细胞(桶数量)进行取模操作,非常简单实用。
二,处理冲突
哈希表避免不了冲突,而数据库中往往也利用这一点,将多个链表合并起来,innodb当然也就采用了
链表的方式来处理冲突。那么言外之意每一个数据结构中必须包含一个如普通链表中data_struct *下
的指针,当然这里也可以用void *泛型指针,我们来看看lock_t结构体中:
hash_node_t散列;/* ! & lt;哈希链的节点记录锁*/
确实如此。这也是单项链表实现的基础。
三、哈希表头
一个哈希表当然需要一个哈希表头这个表头指向了具体的细胞数组(内存相似但在堆空间不再栈上),
innodb中如下,我去掉了一些用处不大的:
点击()折叠或打开
-
<李>
李> <李> enum hash_table_sync_t ,,, type ,,,类型的hash_table
李> <李> ulint ,,, n_cells细胞的数量哈希表
李> <李> hash_cell_t ,,,,,,,指针细胞
李> <李> 堆mem_heap_t ,,,
李> <李> 李>
一个元素void *。
点击()折叠或打开
-
<李>
李> <李> void ,,, node ,,,哈希链节点没有
李> <李> hash_cell_t 李>
具体单元的地址了,后面的只是地址指针+ +就可以了。那么我们user_str也至少包含这样一个
hash_table_t *的指针来指向整个哈希表,确实如此在innodb lock_sys_t中包含了
hash_table_t * rec_hash
那么我们可以lock_sys_t和lock_t为列子画一张展示图如下:
MYSQL INNODB中哈希查找表的实现