`
丁林.tb
  • 浏览: 799251 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

MySQL内置结构hash表的使用

阅读更多

最近实现的两个patch都使用到了MySQL内置的hash结构。这个结构在MySQL框架层中被多处使用,理解它可以方便代码阅读。

1、             总体

InnoDB中也有自带的HASH表, 本文中介绍的是MySQL框架层的hash 其定义的头文件在include/hash.h,实现位置mysys/hash.c。内部存储数据使用了动态数组DYNAMIC_ARRAY

这个hash表实现了插入、删除、修改、查找接口,也提供了遍历接口。在打patch时会发现很好用。

 

2、初始化 _my_hash_init

a) 声明     

参数表

说明

HASH *hash

欲初始化的hash表地址

uint growth_size

Hash表空间不够时再次申请的个数

CHARSET_INFO *charset

系统字符集

ulong default_array_elements

初始容量

size_t key_offset

Keydata中的偏移量

size_t key_length

Key的长度

my_hash_get_key get_key

获取key的回调函数

void (*free_element)(void*)

析构回调

uint flags

hash表类型

 

b) 说明:1) 调用时growth_size一般取值为0,内部会根据初始值和每个HASH_LINK大小得到一个合理的值(./mysys/array.c), sizeof(HASH_LINK)=sizeof(int)+sizeof(char*);

         2)hash表类型目前只有01(HASH_UNIQUE), 1表示key值不允许重复;

         3) 析够回调中,对于传入的元素指针,需要自定义一个合适的删除方法。

         4)特别说明typedef uchar *(*my_hash_get_key)(const uchar *,size_t*,my_bool) 若该回调函数不为NULL 则通过该函数的size_t*传出key的长度, 返回值为keydata中的起始地址 若为NULL,则偏移量为key_offsetkey长度为key_length

 

init的声明中可以看到,这个hash表中存的是全数据(data), 也包含了key的内容。Key作为data的一部分,通过my_hash_get_key告诉hashkey的获取方式(当然获取到key之后,最终还是签名后决定hash位置)

 

3、插入元素 my_hash_insert

      a) 声明      

参数表

说明

HASH *info

hash表地址

const uchar *data

插入的数据地址

   b)说明: 1)可以看到,插入的参数只有一个datakey的获取方式即为init时指定的my_hash_get_key key_offset& key_length;

          2) 需要注意,hash中存的只是data的地址,因此data不能为栈变量。且需要在free_element中自定义删除方法。

          3)返回值为TRUE时,表示插入失败,为0时表示插入成功。

4、查找元素 my_hash_search

      a) 声明      

参数表

说明

const HASH *info

hash表地址

const uchar *key

查找的key

size_t length

Key长度

   b)说明: 1)返回值为查找到的data的地址,若查找不到,返回NULL

          2)由于直接返回data的地址,因此如果要修改data中的key字段,可以直接指针操作。

5、删除/修改元素

      a) 删除my_hash_delete 

参数表

说明

const HASH *info

hash表地址

const uchar *data

删除的数据地址

   说明: 1)注意这里是按照地址比较的,非key

      b) 修改my_hash_update      

参数表

说明

const HASH *info

hash表地址

const uchar *data

修改的数据地址

uchar *old_key

key

size_t old_key_length

key长度

   说明: 1)该函数的功能是,当data内容有涉及到key的修改时,修改key,及其在hash表的位置。 效果上等效于delete+insert,但效率更高。

 

6、遍历

遍历功能使得这个数据结构非常好用。看下面的代码就知道用法了。

for(i=0; i<my_hash->records; i++)
{
    hash_item= (hash_item_t*)my_hash_element(my_hash, i);
}

 

 

 

 

说明:其中hash_item_thash表中的元素――我们自定义的类型。

 

7、一个例子

用一个例子来简要说明用法,只需要演示init部分就可以了。

初始化语句

hash_init(&table_hash, &my_charset_bin, MAX_RECORD_NUM+16, 0, 0, hash_item_get_key, (hash_free_key)hash_item_free_entry, MYF(0));

 

说明:MySQL代码中多使用这个宏,其中growth_size在替换中默认使用0;

 

typedef struct st_hash_item
{
    int value;
    int key_len;
    char key[2*NAME_CHAR_LEN+1];
}hash_item_t;

uchar *hash_item_get_key(const uchar *record, size_t *length, my_bool not_used __attribute__((unused)))
{ 
  hash_item_t *entry= (hash_item_t*) record;
  *length= entry->key_len;
  return (uchar*) entry->key;
}

static void hash_item_free_entry(hash_item_t* record)
{
    delete record;
    DBUG_VOID_RETURN;
}

 

 

 

说明:1)我们使用字符串的key,因此在hash_item_t中有key_lenkey[]。配合hash_item_get_key提供根据输入的data,获取key_lenkey的方法。

      2)由于inserthash表的数据是通过new hash_item_t的方法得到的,因此在free_entry中直接使用delete回收。

2
1
分享到:
评论
1 楼 pirate1997 2013-03-15  
对于这个结构我使用了以下代码:

初始化:
my_hash_init(&c_sql,system_charset_info,100,0,100,0,0,HASH_UNIQUE);

插入数据:
char tmp[100];//临时定为100
strcpy(tmp,thd->query_string.str());
my_hash_insert(&c_sql,(uchar *)tmp);

遍历:
for(i=0 ; i<c_sql.records;i++)
    fprintf(stderr,"COM_QUERY : %s \n",(char *)my_hash_element(&c_sql,i));

每次插入是总不会成功,而且遍历时只能看到最后两次插入的数据,本意是想保留100条的,
能否给个简单示例说明这个结构如何使用的?
谢谢。
我的信箱:pirate1997@163.com

相关推荐

    MySQL使用手册、帮助文档

    `CREATE TABLE`用于创建新表,`ALTER TABLE`用于修改已有表结构,`DROP TABLE`用于删除表。表中的字段有数据类型,如INT、VARCHAR、DATE等,还有NULL、NOT NULL约束,以及主键(PRIMARY KEY)和外键(FOREIGN KEY)...

    mysql server 5.1参考手册

    7. **函数与运算符**:MySQL包含大量内置函数,如数学函数、字符串函数、日期和时间函数,以及比较和逻辑运算符,用于处理数据。 8. **视图**:视图是虚拟表,由查询结果组成。手册会解释如何创建、修改和使用视图...

    mysql自己整理的学习文档

    创建表使用`CREATE TABLE`语句,修改表结构使用`ALTER TABLE`,删除表使用`DROP TABLE`。 - **关系型数据库设计原则**:遵循第三范式(3NF),确保数据无冗余且减少更新异常,提高数据的一致性。设计时要避免部分...

    mysql 8.0官方文档

    MySQL支持B-Tree、Hash、R-Tree等多种类型的索引,其中B-Tree最常用。INDEX和UNIQUE关键字用于创建索引,EXPLAIN用于分析查询计划。 5. **视图**: - 视图是虚拟表,基于一个或多个表的查询结果。视图可以简化复杂...

    mysql数据库技术参考手册

    2. 使用CREATE TABLE语句定义表结构,包括字段名、数据类型、约束条件(如NOT NULL、UNIQUE、PRIMARY KEY)等。 五、数据操作 1. 插入数据:使用INSERT INTO语句向表中添加新记录。 2. 查询数据:SELECT语句是最...

    mysql5.6官方最新手册

    5.6版本增加了Performance Schema,这是一个内置的性能监控框架,可以帮助用户深入理解MySQL的运行情况,包括锁等待、线程状态、内存使用等,为优化数据库性能提供了有力工具。 六、高可用与灾难恢复 MySQL 5.6加强...

    mysql中文教程(pdf)C

    常见的备份方法有全量备份、增量备份和差异备份,恢复则涉及使用mysqldump和mysql命令行工具,或者利用InnoDB引擎的内置事务日志。 在性能优化方面,可以通过分析查询性能、调整查询语句、优化索引、合理设计数据库...

    MySQL新技术探索与实践

    2. Percona Toolkit:一组用于MySQL性能优化和诊断的命令行工具,如pt-online-schema-change用于在线修改表结构。 3. mysqldump:用于数据库备份和迁移,可生成SQL脚本,实现数据的导入导出。 4. MySQL ...

    MySQL chm 版中文参考手册

    手册还将包含如何使用MySQL内置的性能监视工具,如SHOW STATUS和SHOW VARIABLES,以及如何通过调整配置参数来优化系统性能。 总之,“MySQL chm版中文参考手册”是学习和掌握MySQL的全方位指南,无论你是初学者还是...

    mysql语句集合包括模糊查询索引函数

    4. **查询表属性.txt**:可能包含了如何查询表的结构、列信息、索引信息等,比如使用`DESCRIBE`或`SHOW COLUMNS FROM`命令。 5. **主外键约束多对多.txt**:多对多关系是数据库设计中常见的关系类型,通常通过创建...

    最详细的MySQL知识笔记.pdf

    2. 常用函数:MySQL提供了大量的内置函数,包括算术函数、字符串函数、日期时间函数、聚合函数(如COUNT、SUM)以及条件判断函数(IF、CASE)等。 3. SQL语句:包括DQL(数据查询语言)用于查询数据,DML(数据操纵...

    mysql数据示例

    4. 优化器:MySQL自动选择最优的执行路径,但也可以通过优化查询语句和调整表结构来辅助。 总结,"mysql数据示例"主要涵盖了MySQL数据库的基础知识,包括数据库和表的概念、SQL语言的应用、索引的重要性、事务处理...

    大牛讲解的MySQL介绍及性能优化 PPT

    - 数据库概念:MySQL是一个用于组织和管理数据的系统,它使用SQL(结构化查询语言)来操作数据。 - 特性:开源、免费、跨平台、高性能、易于使用和扩展。 - 架构:MySQL采用客户端-服务器模型,包括数据库服务器...

    mysql深入浅出

    SQL基础涵盖如何创建数据库、表结构,以及基本的SELECT语句用于查询数据。 2. **SQL运算**:SQL运算包括比较运算符(如=, , &gt;, &lt;, &gt;=, )、逻辑运算符(AND, OR, NOT)和组合运算符(UNION, INTERSECT, EXCEPT)。...

    MySQL_data.dll

    首先,MySQL是一个支持SQL(结构化查询语言)的数据库,它允许用户通过SQL语句来创建、查询、更新和管理数据。SQL是数据管理的标准语言,使得MySQL易于学习和使用。MySQL_data.dll可能包含了与执行这些SQL操作相关的...

    Mysql学习笔记.pdf

    MySQL 提供了丰富的内置函数,如数学函数(SIN, COS, EXP等)、字符串函数(CONCAT, SUBSTRING, REPLACE等)、日期和时间函数(NOW, DATE_ADD, TIMESTAMPDIFF等)、聚合函数(COUNT, SUM, AVG, MAX, MIN等)。...

    mysql MySQL数据库开发优化与管理维护

    - **使用OPTIMIZE TABLE**:通过OPTIMIZE TABLE命令来整理表结构。 - **常用SQL的优化**: - **大批量插入数据**:优化批量插入操作以提高效率。 - **优化INSERT语句**:改进INSERT语句以加快插入速度。 - **...

    《MySQL中文参考手册》CHM格式.rar

    SQL语言:SQL(结构化查询语言)是与MySQL交互的主要工具,手册详细介绍了SELECT语句用于数据查询、INSERT用于数据插入、UPDATE用于数据修改、DELETE用于数据删除,以及CREATE、ALTER、DROP等用于数据库和表结构管理...

    Mysql最新完整的中文文档

    MySQL是一款广泛使用的开源关系型数据库管理系统(RDBMS),它基于结构化查询语言(SQL)进行数据操作。这款系统以其高效、稳定和易用性在众多数据库系统中脱颖而出,尤其适用于互联网应用。以下是对“Mysql最新完整...

    mysql_help.zip_MYSQL_Variety_crowdpsr

    使用`CREATE TABLE`语句来定义表结构,包括字段名、数据类型、主键等。`ALTER TABLE`用于修改已存在的表结构,`DROP TABLE`则用于删除表。 4. **索引**: 索引可以极大提升查询速度。MySQL支持不同类型的索引,如...

Global site tag (gtag.js) - Google Analytics