`

mysql内核分析--innodb哈希表的内部实现(上) (摘自老杨)

阅读更多

1.哈希表的概述

hash表的实现是innodb的基础功能之一,通过关键值进行映射,从而迅速进行查询、插入、删除的操作。

hash表算法,在数据库内核里面被广泛的使用,举个例子,这个结构将会在下文中继续使用的。

/* Data structure for a column in a table */

struct dict_col_struct{

hash_node_t hash; /* hash chain node */

ulint ind; /* table column position (they are numbered

starting from 0) */

ulint clust_pos;/* position of the column in the

clustered index */

ulint ord_part;/* count of how many times this column

appears in ordering fields of an index */

const char* name; /* name */

dtype_t type; /* data type */

dict_table_t* table; /* back pointer to table of this column */

ulint aux; /* this is used as an auxiliary variable

in some of the functions below */

};

从数据结构的名称上来看,这个关于列结构的,具有相同hash值的col结构,通过hash字段进行连接。该字段的定义如下:

typedef void* hash_node_t;

col结构里面的其它字段表明该列的一些属性:name表示列名,type表明列的值类型,table表明该列所属的表结构。

2.数据结构

typedef struct hash_table_struct hash_table_t;

typedef struct hash_cell_struct hash_cell_t;

typedef void* hash_node_t;

/* The hash table structure */

struct hash_table_struct {

ibool adaptive;/* TRUE if this is the hash table of the

adaptive hash index */

ulint n_cells;/* number of cells in the hash table */

hash_cell_t* array; /* pointer to cell array */

ulint n_mutexes;/* if mutexes != NULL, then the number of

mutexes, must be a power of 2 */

mutex_t* mutexes;/* NULL, or an array of mutexes used to

protect segments of the hash table */

mem_heap_t** heaps; /* if this is non-NULL, hash chain nodes for

external chaining can be allocated from these

memory heaps; there are then n_mutexes many of

these heaps */

mem_heap_t* heap;

ulint magic_n;

};

struct hash_cell_struct{

void* node; /* hash chain node, NULL if none */

};

1)创建hash

n_cells表明hash表的大小,我们都知道hash表常用的是进行素数的模操作。先看下创建hash表的函数的实现。

/*****************************************************************

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;

prime = ut_find_prime(n);

table = mem_alloc(sizeof(hash_table_t));

array = ut_malloc(sizeof(hash_cell_t) * prime);

table->adaptive = FALSE;

table->array = array;

table->n_cells = prime;

table->n_mutexes = 0;

table->mutexes = NULL;

table->heaps = NULL;

table->heap = NULL;

table->magic_n = HASH_TABLE_MAGIC_N;

/* Initialize the cell array */

for (i = 0; i < prime; i++) {

cell = hash_get_nth_cell(table, i);

cell->node = NULL;

}

return(table);

}

在创建hash表的时候,我们提供的常用是一个普通的数字,来指明hash表的大小。这个n的值可能不是素数,所以需要通过ut_find_prime(n)来产生一个稍大于n的素数,当然这个素数不一定是大于n的最小素数。ut_find_prime的具体实现见文件ut0rnd.c

接着调用mem_alloc函数来分配hash表结构,为该结构分配空间,这个比较简单。接着分配数量为prime个的hash单元,并通过后面的循环语句将单元的node指针置为空。

2)基础的函数

提供值之后,我们需要进行映射,获取对应的单元的编号。

/******************************************************************

Calculates the hash value from a folded value. */

UNIV_INLINE

ulint

hash_calc_hash(

/*===========*/

/* out: hashed value */

ulint fold, /* in: folded value */

hash_table_t* table) /* in: hash table */

{

return(ut_hash_ulint(fold, table->n_cells));

}

其中ut_hash_ulint函数的实现如下:

/***********************************************************

The following function generates a hash value for a ulint integer

to a hash table of size table_size, which should be a prime

or some random number for the hash table to work reliably. */

UNIV_INLINE

ulint

ut_hash_ulint(

/*=========*/

/* out: hash value */

ulint key, /* in: value to be hashed */

ulint table_size) /* in: hash table size */

{

key = key ^ UT_HASH_RANDOM_MASK2;

return(key % table_size);

}

通过模操作获得了对应的hash表单元的数值,然后就可以通过该数值找到hash表的该单元节点,调用hash_get_nth_cell函数,函数实现如下:

/****************************************************************

Gets the nth cell in a hash table. */

UNIV_INLINE

hash_cell_t*

hash_get_nth_cell(

/*==============*/

/* out: pointer to cell */

hash_table_t* table, /* in: hash table */

ulint n) /* in: cell index */

{

ut_ad(n < table->n_cells);

return(table->array + n);

}

分享到:
评论

相关推荐

    undrop-for-innodb

    yum install make gcc flex bison cd /root/undrop-for-innodb-master make 会产生三个文件c_parser innochecksum_changer stream_parser

    percona-data-recovery-tool-for-innodb-0.5.tar.tar

    percona-data-recovery-tool-for-innodb-0.5.tar.tar

    MySQL内核 INNODB存储引擎-卷1-高清-完整目录-2014年5月

    MySQL内核 INNODB存储引擎-卷1-高清-完整目录-2014年5月

    MySQL内核:InnoDB存储引擎 卷1.pdf.zip

    深入学习《MySQL内核:InnoDB存储引擎 卷1》,读者可以了解到InnoDB的内部工作机制,如如何处理B+树索引、事务的提交与回滚、锁的实现以及内存管理等内容,这对于优化数据库性能、解决并发问题、设计高效的数据模型...

    MySQL内核:InnoDB存储引擎 卷1.pdf

    卷1》由资深MySQL专家,机工畅销图书作者亲自执笔,在以往出版的两本InnoDB介绍性图书的基础之上,更深入地介绍InnoDB存储引擎的内核,例如latch、B+树索引、事务、锁等,从源代码的角度深度解析了InnoDB的体系结构...

    8.MySQL存储引擎--MyISAM与InnoDB区别1

    MySQL存储引擎--MyISAM与InnoDB区别 MySQL是一种关系型数据库管理系统,它支持多种存储引擎,每种存储引擎都有其特点和优缺。MyISAM和InnoDB是MySQL中最常用的两种存储引擎,它们都有其优缺点,本文将对比MyISAM...

    mysql-5.7.24-win32.zip

    # 创建新表时将使用的默认存储引擎 default-storage-engine=INNODB # 默认使用“mysql_native_password”插件认证 #mysql_native_password default_authentication_plugin=mysql_native_password [mysql] # 设置...

    mysql内核 innodb存储引擎

    接着以InnoDB的内部实现为切入点,逐一详细讲解了InnoDB存储引擎内部的各个功能模块,包括InnoDB存储引擎的体系结构、内存中的数据结构、基于InnoDB存储引擎的表和页的物理存储、索引与算法、文件、锁、事务、备份,...

    mysql-8.0.28-winx64.zip + mysql80-community-release-el7-5.noarch

    MySQL是世界上最受欢迎的开源关系型数据库管理系统之一,其最新版本为8.0.28。在本案例中,我们有两个不同平台的安装包:一个是针对Windows操作系统的“mysql-8.0.28-winx64.zip”,另一个是用于Linux(特别是基于...

    LNH_MySQL 09-MySQL服务InnoDB引擎特点讲解.mp4

    LNH_MySQL 09-MySQL服务InnoDB引擎特点讲解.mp4

    mysql-connector-java-8.0.11

    MySQL Connector/J是MySQL数据库与Java应用程序之间的重要桥梁,它是一个实现了Java Database Connectivity (JDBC) API的驱动程序,使得Java开发者能够方便地在MySQL数据库上执行SQL查询和操作。在这个"mysql-...

    mysql-connector-java-5.1.34.jar

    MySQL是世界上最受欢迎的关系型数据库管理系统之一,而`mysql-connector-java-5.1.34.jar`是MySQL为Java应用程序提供的数据库连接驱动程序,用于在Java应用和MySQL数据库之间建立通信桥梁。这个JAR(Java Archive)...

    LNH_MySQL 10-MySQL服务InnoDB引擎适合的生产应用场景.mp4

    LNH_MySQL 10-MySQL服务InnoDB引擎适合的生产应用场景.mp4

    LNH_MySQL 08-MySQL服务InnoDB引擎介绍及磁盘文件格式.mp4

    LNH_MySQL 08-MySQL服务InnoDB引擎介绍及磁盘文件格式.mp4

    mysql-5.5.27-win32

    4. **分区功能增强**:MySQL 5.5引入了更多的分区策略,如线性哈希分区,使得大数据管理和分析更为高效。 5. **Full-text Search**:全面改进了全文搜索功能,支持短语搜索和布尔操作符,使得在文本数据中查找信息...

    mysql-installer-community-8.0.28.0 MySql数据库安装包

    MySQL是世界上最受欢迎的开源关系型数据库管理系统之一,其最新版本为8.0.28.0社区版。这个“mysql-installer-community-8.0.28.0”压缩包包含的是MySQL数据库的安装程序,专为用户提供了一个方便的方式来安装和配置...

    LNH_MySQL 11-MySQL服务InnoDB引擎调优及不同引擎功能对比.mp4

    LNH_MySQL 11-MySQL服务InnoDB引擎调优及不同引擎功能对比.mp4

    mysql-8.0.33-winx64.zip(mysql安装包)

    1. **InnoDB存储引擎增强**:InnoDB作为MySQL的默认存储引擎,得到了大量优化,包括更快的行锁定、更好的并发性能以及支持更大的表空间。 2. **JSON支持**:MySQL 8.0增强了对JSON数据类型的处理,提供了丰富的函数...

    mysql-8.0.26-winx64.zip

    - MySQL 8.0引入了许多新特性,如窗口函数、JSON操作增强、更好的性能优化器、InnoDB表空间加密等。 8. **备份与恢复** - 可以使用`bin\mysqldump.exe`进行数据库备份,而`bin\mysqlimport.exe`用于导入数据。...

    mysql-connector-java-5.1.25.jar免费下载

    它还支持MySQL的一些高级功能,如分区表、复制、InnoDB事务隔离级别等。 值得注意的是,虽然`5.1.25`是一个较旧的版本,但它是稳定可靠的,并且兼容大多数的Java和MySQL环境。然而,对于新的项目或升级,建议使用...

Global site tag (gtag.js) - Google Analytics