MySQL源码 数据结构array

MySQL源码中自己定义了许多数据结构,放在mysys的目录下,源码中通常都使用这些数据结构来组织存放数据,也更容易实现跨平台。

下面先来看下MySQL定义的动态数组:

【源代码include/array.h  mysys/array.c】


typedef struct st_dynamic_array
{
uchar *buffer;
ulong elements, max_element;
ulong alloc_increment;
uint size_of_element;
} DYNAMIC_ARRAY;

特点:

1. 动态数组中的元素具有固定的内存空间大小 size_of_element

2.
插入一个元素时,提供元素的指针,写入时会指针所指向的位置开始后的size_of_element字节的内存memcpy到数组中

3. 检索时,提供单个索引位置的直接定位,或者根据elements来for轮询所有的元素

下面看一下针对动态数组的函数:

1. init_dynamic_array2(DYNAMIC_ARRAY *array, uint
element_size,

void *init_buffer, ulong
init_alloc, 
                           
ulong alloc_increment)

初始化elements=max_element=0

malloc
init_alloc*element_size大小的内存空间给array->buffer。

2. insert_dynamic(DYNAMIC_ARRAY *array, uchar*
element)

插入一个元素 element

如果elements==max_element,则内存空间已经使用完,需要realloc空间,并把原来空间的内存memcpy过来。

最后追加element到数组的最后

3. alloc_dynamic(DYNAMIC_ARRAY *array)

分配一个新的元素空间,并把elements++;

4. pop_dynamic(DYNAMIC_ARRAY *array)

弹出数组的最后一个元素,这里只是把elements--即可。

5. get_dynamic(DYNAMIC_ARRAY *array, uchar*
element, ulong idx)

获取array数组中位置是idx的元素,并把内存copy到element中,所以调用前需要给element分配好空间。

6. delete_dynamic(DYNAMIC_ARRAY *array)

删除动态数组,并使用my_free把内存释放出来

7. delete_dynamic_element(DYNAMIC_ARRAY *array,
ulong idx)
         
删除数组中位置是indx的元素,并把indx后面的元素向前移动。

8. get_index_dynamic(DYNAMIC_ARRAY *array, uchar*
element)

获取element在数组中的位置。

时间: 2024-10-08 17:28:14

MySQL源码 数据结构array的相关文章

MySQL源码 数据结构hash

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 *); type

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

http://www.orczhou.com/index.php/2012/11/mysql-source-code-data-structure-about-index/ 本文将尝试介绍MySQL索引存储相关的数据结构.程序=数据结构+算法,了解数据结构,然后就可以进一步了解MySQL源码中如何使用索引,如何选择自己的执行计划. 目录 [hide] 1. MySQL如何描述某个数据表的索引 2. GDB打印观察索引信息 2.1 打印索引基本信息 2.2 打印索引某一列的基本信息 2.3 打印索

MySQL源码 information_schema新增表

information_schema是MySQL下的DB, 存储了数据库的数据字典,但OS系统上,并没有information_schema下表的数据和结构文件. 所以,MySQL在针对information_schema下的表进行查询的时候,在内存中构造了memory引擎的临时表,把数据填充进去,最后返回给client. 下面看下我们如何来增加一个information_schema下的表,统计一下你想要的信息,供实时查询: 比如select * from information_schema

MySQL源码 解析器

sql请求发送到server端,需要经过解析器生成内部的数据结构对象,以方便进行优化和生成执行计划.解析器主要做了两件事情,词法分析和语法分析. 词法和语法分析:mysql使用lex词法分析器,yacc语法分析器进行分析,最后保存到lex对象结构中. 例如:     select id, name from xpchild where id=1 1. 在mysql_parse函数中使用lex_start初始化thd->lex对象,然后调用yacc中的MYSQLparse函数进行词法和语法分析.

Mysql源码目录结构

Programs for handling SQL commands. The "core" of MySQL. These are the .c and .cc files in the sql directory: derror.cc --- read language-dependent message file des_key_file.cc --- load DES keys from plaintext file discover.cc --- Functions for

MySQL源码编译安装

1.安装cmake-2.8.10.2.tar.gz 以root用户进入shell #tar -zxvf  cmake-2.8.10.2.tar.gz #cd cmake-2.8.10.2 #./configure #make                         (无法make,检测gcc编译环境) #make install --------------------------------- 2.安装ncurses-5.9.tar.gz #tar -zxvf  ncurses-5.9

在win7 下编译MySQL源码

MySQL MySQL是一款优秀的开源数据库,在阿里.网易等各个互联网公司中有着广泛的应用.尽管各种NoSQL大行其道,但是关系型数据库依然必不可少. 作为一个新手,在Win7下用源码安装MySql数据库并不容易.我自己都折腾了好几天.今天把安装过程记录下来,其一是为了方便自己以后学习,其二则是分享过程,让学习者能够从我这篇文章中受益. 1. 编译环境及源码下载 编译环境:Visual Studio 2010 (Win7 32位) 编译工具: bison-2.4.1-setup.exe 下载地址

MySQL源码之两阶段提交

在双1的情况下,两阶段提交的过程 环境准备:mysql 5.5.18, innodb 1.1 version配置: sync_binlog=1 innodb_flush_log_at_trx_commit=1 autocommit=0 设置断点: sql_parse.cc::dispatch_command --命令跳转入口 sql_parse.cc::mysql_parse sql_parse.cc::mysql_execute_command sql_parse.cc::trans_comm

MySQL源码之mysqld启动

启动mysqld,并进入listen阶段 函数调用栈: mysqld_main(): my_init();初始化变量,锁,错误串 my_thread_global_init(): 初始化互斥锁,信号量,线程独享变量 load_defaults();查找my.cnf sys_var_init();初始化system variables init_common_variables:初始化mutex,status变量 init_signals:初始化信号量处理 init_server_componen