- 浏览: 209413 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
Prepared:
Hadoop的几个明显缺点 -
CSunDNan:
...
openjdk jvm 方法字节码执行过程 -
幻影之蚀:
...
mysql 源码分析2 源码调试环境建立 -
shukongchengje:
紧急呼唤楼主,mysql代码从哪里弄?官网wiki上看的一头雾 ...
mysql源码分析 整体架构 -
yeshaoting:
好文章.不介意的话转载了.
jvm 字节码中文含义
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);
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/whyangwanfu/archive/2008/09/21/2958762.aspx
发表评论
-
mysql 核心内幕
2010-03-30 17:34 1366目录 第1章 MySQL的前世今生 1.1 MySQ ... -
并发控制原理
2010-03-30 17:31 996事务之间的相互影响可能导致数据库状态的不一致,即使各个事务能保 ... -
聚集索引与非聚集索引的基本概念
2010-03-30 17:14 1310聚集索引,是一种指明 ... -
bitmap索引的深入研究
2010-03-30 17:03 1385位图(bitmap)索引是另外一种索引类型,它的组织形式与B树 ... -
Mysql源代码分析系列
2010-03-30 16:51 5874Mysql源代码分析系列(2): 源代码结构 Mysql ... -
并发控制原理
2010-03-30 16:46 939事务之间的相互影响可能导致数据库状态的不一致,即使各个事务能保 ... -
数据库性能调优技术
2010-03-30 16:45 749一、概述 随着数据库在各个领域的使用不断增长,越来越多 ... -
日志系统原理
2010-03-30 16:40 1002一:事务系统 1.事务的工作模型 事务必须满足原子性,所 ... -
Mysql查询优化器浅析
2010-03-30 16:33 9901 定义 Mysql查询优化器的工作是为查询语句选择 ... -
InnoDB页结构浅析
2010-03-30 16:32 1184InnoDB将所有的记录存放在数据库页中(也可以称为数据块)。 ... -
InnoDB记录结构浅析
2010-03-30 16:31 738InnoDB记录由三个部分组成,见表1: 表1:InnoDB的 ... -
mysql5.1在windows下的编译方法
2010-03-30 16:28 1299编译步骤 1、从mysql.com ... -
mysql 在 VS2005上面单步调试
2010-03-30 13:39 1523mysql 在 VS2005上面单步调试 收藏 http:/ ... -
mysql 源码分析2 源码调试环境建立
2010-03-05 12:57 13761.下载源码 2.建立工程 3.调试 待续。。。 -
memcached 架构分析
2009-12-13 21:08 1110memcached 架构分析 -
无法抗衡关系型数据库 NoSQL革命仍要等待
2009-08-04 02:40 1140NoSQL架构可以省去将Web或者Java 应用和数据转换成S ... -
no sql
2009-08-04 02:31 928什么是NoSQL 1.不要叫它们数据库。 2.它们可以处理超大 ... -
B树
2009-07-28 16:35 1066B树 即二叉搜索树: 1.所有 ... -
索引基础
2009-07-28 14:43 9171.索引是什么? 索引是一个单独的、物理的数据库结构, ... -
mysql源码分析 整体架构
2009-07-28 03:13 8626大致分析完了mysql整体架构 明确了mysql架构,其实也就 ...
相关推荐
深入学习《MySQL内核:InnoDB存储引擎 卷1》,读者可以了解到InnoDB的内部工作机制,如如何处理B+树索引、事务的提交与回滚、锁的实现以及内存管理等内容,这对于优化数据库性能、解决并发问题、设计高效的数据模型...
MySQL是世界上最流行的关系型数据库管理系统之一,其5.5版本是一个重要的里程碑,提供了许多改进和增强功能。在本文中,我们将深入探讨MySQL客户端和服务器组件,以及5.5.48这一具体版本的重要特性。 首先,`MySQL-...
4. **分区功能增强**:MySQL 5.5对表分区功能进行了扩展,支持更多的分区类型,如线性哈希和RANGE COLUMNS,使得大型表的管理和查询更加高效。 5. **Full-text索引增强**:5.5版本引入了对全文索引的改进,包括短语...
《MySQL技术内幕_InnoDB存储引擎_姜承尧_第2版》是一本深入探讨MySQL数据库中InnoDB存储引擎的专业书籍。作者姜承尧是数据库领域的知名专家,他的这部著作详细阐述了InnoDB引擎的核心概念、设计原理以及实际操作技巧...
姜承尧著有《MySQL技术内幕:InnoDB存储引擎》、《MySQL内核:InnoDB存储引擎》等著作,在MySQL领域具有深厚的理论基础和实践经验。 - **实战导向**:课程内容紧密结合互联网公司的实际应用场景,通过BAT、网易等...
《数据库内核:基于网易互联网业务的MySQL内核优化之路》是一本深入探讨MySQL数据库内核优化的专业文献,尤其针对网易公司所面临的互联网业务场景进行了详细的解析和实践分享。本书内容丰富,涵盖了数据库性能调优的...
### 一步到位实现MySQL优化 #### 一、MySQL优化概览 MySQL作为一款广泛使用的开源关系型数据库管理系统,在众多应用场景中扮演着至关重要的角色。为了确保MySQL能够在各种工作负载下保持高性能、高可用性以及良好...
- **《Understanding the Linux Kernel》**:虽然不是直接关于MySQL,但深入理解Linux内核有助于更好地管理和优化运行在Linux上的MySQL实例。 以上知识点涵盖了MySQL内部原理的主要方面,通过学习这些内容,无论是...
在"mysql-kernel-develop-doc.zip"这个压缩包中,包含了一份名为"mysql开发快捷核心命令.docx"的文档,这很可能是关于MySQL内核开发和SQL查询的速查手册。以下是基于这些信息的MySQL数据库和SQL相关的详细知识点: ...
这些命令帮助我们深入了解MySQL服务器的内部运作,为后续的优化工作提供数据支持。 #### 调整连接参数 - **`max_connections`**:控制MySQL同时能接受的最大连接数。过高的值可能会导致服务器资源耗尽,而过低则...
#### 二、MySQL内核设计原理 ##### 2.1 存储引擎 存储引擎是MySQL的一个重要组成部分,负责处理数据的存储和检索。MySQL支持多种存储引擎,包括但不限于: - **InnoDB**:支持事务处理,提供行级锁定机制,能够...
新的InnoDB系统表空间格式可以提高磁盘空间利用率,而innodb_adaptive_hash_index_parts参数的引入则允许用户调整哈希索引的并行度,进一步优化查询性能。 在SQL功能上,MySQL 5.7引入了JSON数据类型,支持非结构化...
2. **读写分离**:实现主从复制,将读操作分担到从库上。 3. **缓存机制**:引入Redis等缓存中间件减轻数据库负担。 4. **分布式事务处理**:采用Paxos或Raft算法解决分布式系统中的数据一致性问题。 #### 七、案例...
- 同样基于哈希表实现,但更加线程安全。 ### 三、并发编程 1. **ThreadLocal的底层原理** - `ThreadLocal` 通过每个线程拥有独立的变量副本实现线程间的隔离。 - 主要用于解决线程安全问题。 2. **如何理解...
- 存储引擎:InnoDB(事务、行级锁定)、MyISAM(非事务、表级锁定)。 - 触发器、存储过程、函数。 - 查询优化:EXPLAIN分析、索引优化、减少全表扫描。 - 安全性:用户权限管理、GRANT和REVOKE命令。 【Redis】 ...
- 创建MySQL表结构用于存储用户信息和权限设置: ```sql CREATE TABLE `PUSH_MQTT_USERS` ( `ID` CHAR(36) NOT NULL COMMENT 'MQTT登录用户ID', `USERNAME` VARCHAR(25) NOT NULL COMMENT 'MQTT登录用户名', `...
Mysql的表切分策略可以有效分散单个数据库的压力,而InnoDB存储引擎以其事务安全性和行级锁机制,成为高并发场景下的首选。 - **动态Cache服务器**:使用如Memcached这样的分布式缓存服务器,可以大幅减轻数据库...
- **记录存储**:了解 InnoDB 引擎下的行格式、页结构等概念,掌握数据是如何在磁盘上组织和存储的。 - **事务管理**:熟悉事务的四大特性(ACID)以及如何通过 BEGIN WORK、COMMIT 和 ROLLBACK 命令来控制事务边界...
2. **数据库引擎比较**:MySQL中的InnoDB和MyISAM是最常见的两个引擎,前者支持事务处理,后者不支持。InnoDB适合事务处理和数据完整性,MyISAM则在读取速度上有优势。 3. **数据库的隔离级别**:包括读未提交...