MySQL源码自定义了hash表,因为hash表具有O(1)的查询效率,所以,源码中大量使用了hash结构。下面就来看下hash表的定义:

【源代码文件include/hash.h mysys/hash.c】

typedef uint my_hash_value_type;
typedef uchar *(*my_hash_get_key)(const uchar *,size_t*,my_bool);
typedef void (*my_hash_free_key)(void *); typedef struct st_hash {
size_t key_offset,key_length; /* Length of key if const length */
size_t blength;
ulong records;
uint flags;
DYNAMIC_ARRAY array; /* Place for hash_keys */
my_hash_get_key get_key;
void (*free)(void *);
CHARSET_INFO *charset;
} HASH; typedef struct st_hash_info {
uint next; /* index to next key */
uchar *data; /* data for current entry */
} HASH_LINK;
 
hash的特点:
     1. hash的每一个元素都存放在array动态数组中
     2. 给定一个key值,通过hash算法来计算它在array中的位置
     3. array中的元素存放的是hash_link对象,而使用hash表的对象必须自己申请内存,把地址存放在hash_link->data中
     4. 根据key获取一个元素hash_link->data时,需要强制转换成保存进去的类型。
     5. hash表虽然使用calc_hash来计算hash值,但会按照array的位置(hash_mask函数)来进行存放。
 
用一个图来表示下:
     
 
下面看下hash表的函数:
1.  _my_hash_init(HASH *hash, uint growth_size, CHARSET_INFO *charset,
              ulong size, size_t key_offset, size_t key_length,
              my_hash_get_key get_key,
              void (*free_element)(void*), uint flags)
 
hash:初始化一个hash表
growth_size:初始化hash->array的增长大小
get_key:需要自定义一个从record获取key的方法,然后hash表针对这个key计算hash
free_element:hash中的元素,只记录data的指针,需要自己定义free的方法
 
 
2. my_hash_free_elements(HASH *hash)
  根据hash->elements的值,从array的0到elements来释放hash_link中的data。
  最后hash->elements置为0。
 
3. my_hash_key(const HASH *hash, const uchar *record, size_t *length,

my_bool first)

     根据record和hash中定义的get_key方法来获取key值。
 
4. my_hash_first(const HASH *hash, const uchar *key, size_t length,
                     HASH_SEARCH_STATE *current_record)
 
     根据key,length值来查找hash中的data。如果有hash冲突,就返回第一个。
 
5. my_hash_insert(HASH *info, const uchar *record)
     插入record到hash表中:
     1. 如果需要hash_unique,会先使用my_hash_search进行查询。
     2. 然后计算cacl_hash&&hash_mask来计算位置。
 
6. my_hash_element(HASH *hash, ulong idx)
     获取在hash表位置是idx的元素。
 
为完待续.....     

MySQL源码 数据结构hash的更多相关文章

  1. MySQL源码 数据结构array

    MySQL源码中自己定义了许多数据结构,放在mysys的目录下,源码中通常都使用这些数据结构来组织存放数据,也更容易实现跨平台.   下面先来看下MySQL定义的动态数组: [源代码include/a ...

  2. MySQL源码:索引相关的数据结构

    http://www.orczhou.com/index.php/2012/11/mysql-source-code-data-structure-about-index/ 本文将尝试介绍MySQL索 ...

  3. MySQL源码分析以及目录结构 2

    原文地址:MySQL源码分析以及目录结构作者:jacky民工 主要模块及数据流经过多年的发展,mysql的主要模块已经稳定,基本不会有大的修改.本文将对MySQL的整体架构及重要目录进行讲述. 源码结 ...

  4. MySQL源码分析以及目录结构

    原文地址:MySQL源码分析以及目录结构作者:jacky民工 主要模块及数据流经过多年的发展,mysql的主要模块已经稳定,基本不会有大的修改.本文将对MySQL的整体架构及重要目录进行讲述. 源码结 ...

  5. mysql源码解读之配置文件

    要研究mysql,最好的资源莫过于源码了,所以本人打算通过调试源码的方式来深入理解mysql的点点滴滴.搭建mysql调试环境很简单,从官方下载mysql源码,利用cmake工具生成工程即可.为了方便 ...

  6. Mysql源码分析--csv存储引擎

    一直想分析下mysql的源码,开始的时候不知道从哪下手,先从csv的文件存储开始吧,这个还是比较简单的.我是用的是mysql5.7.16版本的源码. csv源码文件在mysql源码的mysql-5.7 ...

  7. 深入MySQL源码 学习方法 何登成专家

    MYSQL 技术圈 有哪些做得好,又注重分享的公司: Oracle MySQL, MariaDB, Percona,Google, FB, Twitter, Taobao, NetEase… 有哪些值 ...

  8. mysql 源码调试方法

     http://blog.itpub.net/29254281/viewspace-1847415/ 其中吕海波老师分享的内容是 <调试Oracle二三例:调试技术在日常运维中的应用>其中 ...

  9. 【转】Ubuntu编译安装mysql源码

    主要参考了下面两篇文章 http://forum.ubuntu.org.cn/viewtopic.php?t=330121 http://www.linuxidc.com/Linux/2011-09/ ...

随机推荐

  1. git研究1

    error:src refspec master does not match any  将本地GIT版本库PUSH到一个GITHUB上一个空的版本库时出现错误,本地版本库为空, 空目录不能提交 (只 ...

  2. python中关于正则表达式一

    ab+,描述一个'a'和任意个'b',那么'ab','abb','abbbbb' 正则表达式可以:1.验证字符串是否符合指定特征,比如验证是否是合法的邮件地址 2.用来查找字符串,从一个长的文本中查找 ...

  3. iOS谋职之OC面试题

    iOS谋职之OC面试题 iOS求职之OC面试题 IOS求职之OC面试题 1.Objective-C的类可以多重继承么?可以采用多个协议么? 答:不可以多重继承,可以采用多个协议. 2.#import和 ...

  4. Mac 下显示隐藏文件

    将下面的命令粘贴进终端,按提示操作即可(可能需要输入电脑密码) 显示:defaults write com.apple.finder AppleShowAllFiles -bool true 隐藏:d ...

  5. Sublime Text使用手记

    1.Package Control 输入python 命令安装,打开控制台输入下方代码运行即可.控制台打开可使用快捷键Ctrl+~ 或菜单栏中View> Show Console,可访问Pack ...

  6. 插入排序之python实现源码

    def insert_sort(old): for i in range(1, len(old)): for j in range(i, 0, -1): if(old[j] < old[j-1] ...

  7. java特殊运算符(转)

    原码:符号位用0表示正号,用1表示负号,数值一般用二进制形式表示 反码:机器数的反码可由原码得到.如果机器数是正数,则该机器数的反码与原码一样:如果机器数是负数,则该机器数的反码是对它的原码(符号位除 ...

  8. Thrift 应用场景(收集版)

    官网: http://thrift.apache.org/ 一些介绍使用的文章: http://www.ibm.com/developerworks/cn/java/j-lo-apachethrift ...

  9. Oracle数据库小知识,改数据库数据

    在一张表上面右键-->查询数据,会生成sql语句,表后面带有t,表示模糊查询, 后面跟上for update之后,执行语句-->小锁(编辑数据)就可以修改数据里面的数据了,修改之后--&g ...

  10. 『奇葩问题集锦』Zepto 页面唤醒拨号功能点透

    不废话直接上代码: HTML: <a class="js-tel tel" data-tel="1312414"></a> JS: // ...