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 ,,,
      李   <李>      李   
        可以看到hash_cell_t *数组;就是这样一个元素,他实际上就是hash_cell_t就是
  一个元素void *。
        

  点击()折叠或打开   

        
      <李>   
         李   <李>   void ,,, node ,,,哈希链节点没有
      李   <李>   hash_cell_t   李   
        那么通过这个元素他能够指向具体的哈希表了。那么user_str(用户自己的结构体)→→数组节点就指向了一个
  具体单元的地址了,后面的只是地址指针+ +就可以了。那么我们user_str也至少包含这样一个
  hash_table_t *的指针来指向整个哈希表,确实如此在innodb lock_sys_t中包含了
  hash_table_t * rec_hash
  那么我们可以lock_sys_t和lock_t为列子画一张展示图如下:
   MYSQL INNODB中哈希查找表的实现“> <h2 class=MYSQL INNODB中哈希查找表的实现