Atitit.自定义存储引擎的接口设计 api 标准化 attilax 总结  mysql

1. 图16.1:MySQL体系结构1

2. 16.7. 创建表create()虚拟函数:2

3. 16.8. 打开表 open()2

4. ---------------------------------------------------------------------------------------------------------------------2

5. 16.9. 实施基本的表扫描功能2

5.1. 目录3

5.1.1. 16.9.1. 实施store_lock()函数3

5.1.2. 16.9.2. 实施external_lock()函数3

5.1.3. 16.9.3. 实施rnd_init()函数3

5.1.4. 16.9.4. 实施info()函数3

5.1.5. 16.9.5. 实施extra()函数3

5.1.6. 16.9.6. 实施rnd_next()函数3

5.2. CSV引擎的9行表扫描过程中进行的方法调用:3

5.3. 16.9.1. 实施store_lock()函数4

5.4. 实施rnd_init()函数5

5.5. 16.9.4. 实施info()函数5

5.6. 16.9.5. 实施extra()函数5

5.7. 16.9.6. 实施rnd_next()函数6

6. -------------------------------------------------------------------------------------------------------------------6

7. 关闭表close(void)6

8. 6

9. 16.11. 为存储引擎添加对INSERT的支持write_row()6

10. 16.12. 为存储引擎添加对UPDATE的支持update_row()7

11. 16.13. 为存储引擎添加对DELETE的支持delete_row()7

12. 16.14. API引用 与详细说明7

13. 8

14. 参考8

1. 图16.1:MySQL体系结构

存储引擎负责管理数据存储,以及MySQL的索引管理。通过定义的API,MySQL服务器能够与存储引擎进行通信。

每个存储引擎均是1个继承类,每个类实例作为处理程序而被引用。

2. 16.7. 创建表create()虚拟函数:

一旦实例化了处理程序,所需的第1个操作很可能是创建表。

你的存储引擎必须实现create()虚拟函数:

virtual int create(const char *name, TABLE *form, HA_CREATE_INFO *info)=0;该函数应创建所有必须的文件,然后关闭表。MySQL服务器将调用随后需打开的表。

作者:: 老哇的爪子 Attilax 艾龙,  EMAIL:1466519819@qq.com

转载请注明来源: http://www.cnblogs.com/attilax/

3. 16.8. 打开表 open()

在表上执行任何读或写操作之前,MySQL服务器将调用open()方法打开表数据和索引文件(如果存在的话)。

int open(const char *name, int mode, int test_if_locked);第1个参数是要打开的表的名称。第2个参数确定了要打开的文件或准备执行的操作。它们的值定义于handler.h中,

4. ---------------------------------------------------------------------------------------------------------------------

5. 16.9. 实施基本的表扫描功能

5.1. 目录

5.1.1. 16.9.1. 实施store_lock()函数

5.1.2. 16.9.2. 实施external_lock()函数

5.1.3. 16.9.3. 实施rnd_init()函数

5.1.4. 16.9.4. 实施info()函数

5.1.5. 16.9.5. 实施extra()函数

5.1.6. 16.9.6. 实施rnd_next()函数

最基本的存储引擎能实现只读表扫描功能。这类引擎可用于支持SQL日志查询、以及在MySQL

之外填充的其他数据文件。

5.2. CSV引擎的9行表扫描过程中进行的方法调用:

ha_tina::store_lock

ha_tina::external_lock

ha_tina::info

ha_tina::rnd_init

ha_tina::extra - ENUM HA_EXTRA_CACHE Cache record in HA_rrnd()

ha_tina::rnd_next

ha_tina::rnd_next

ha_tina::rnd_next

ha_tina::rnd_next

ha_tina::rnd_next

ha_tina::rnd_next

ha_tina::rnd_next

ha_tina::rnd_next

ha_tina::rnd_next

ha_tina::extra - ENUM HA_EXTRA_NO_CACHE End cacheing of records (def)

ha_tina::external_lock

ha_tina::extra - ENUM HA_EXTRA_RESET Reset database to after open

5.3. 16.9.1. 实施store_lock()函数

在执行任何读取或写操作之前,调用store_lock()函数。

将锁定添加到表锁定处理程序之前(请参见thr_lock.c),mysqld将用请求的锁调用存储锁定。目前,存储锁定能将写锁定更改为读锁定(或其他锁定),忽略锁定(如果不打算使用MySQL锁定的话),或为很多表添加锁定(就像使用MERGE处理程序时作的那样)。

例如,Berkeley

DB能将所有的WRITE锁定更改为TL_WRITE_ALLOW_WRITE(表示我们正在执行WRITES,但我们仍允许其他人员进行操作)。

释放锁定时,也将调用store_lock(),在这种情况下,通常不需做任何事。

在某些特殊情况下,MySQL可能会发送对TL_IGNORE的请求。这意味着我们正在请求与上次相同的锁定,这也应被忽略(当我们打开了表的某一部分时,如果其他人执行了表刷新操作,就会出现该情况,此时,mysqld将关闭并再次打开表,然后获取与上次相同的锁定)。我们打算在将来删除该特性。

在任何表扫描之前调用的函数是rnd_init()函数。函数rnd_init()用于为表扫描作准备,将计数器和指针复位为表的开始状态。

下述示例来自CSV存储引擎:

int ha_tina::rnd_init(bool scan)

{

DBUG_ENTER("ha_tina::rnd_init");

current_position= next_position= 0;

records= 0;

chain_ptr= chain;

DBUG_RETURN(0);

}

5.4. 实施rnd_init()函数

在任何表扫描之前调用的函数是rnd_init()函数。函数rnd_init()用于为表扫描作准备,将计数器和指针复位为表的开始状态。

下述示例来自CSV存储引擎:

5.5. 16.9.4. 实施info()函数

执行表扫描操作之前,将调用info()函数,以便为优化程序提供额外信息。

优化程序所需的信息不是通过返回值给定的,你需填充存储引擎类的特定属性,当info()调用返回后,优化程序将读取存储引擎类。

除了供优化程序使用外,在调用info()函数期间,很多值集合还将用于SHOW TABLE STATUS语句。

在sql/handler.h中列出了完整的公共属性,下面给出了一些常见的属性:

ulonglong data_file_length;           /* Length off data file */ulonglong max_data_file_length;       /* Length off data file */ulonglong index_file_length;ulonglong max_index_file_length;ulonglong delete_length;              /* Free bytes */ulonglong auto_increment_value;ha_rows records;                      /* Records in table */ha_rows deleted;                      /* Deleted records */ulong raid_chunksize;ulong mean_rec_length;         /* physical reclength */time_t create_time;                   /* When table was created */time_t check_time;time_t update_time;  对于表扫描,最重要的属性是“records”,它指明了表中的记录数。当存储引擎指明表中有0或1行时,或有2行以上时,在这两种情况下,优化程序的执行方式不同。因此,当你在执行表扫描之前不清楚表中有多少行时,应返回大于等于2的值,这很重要(例如,数据是在外部填充的)。

5.6. 16.9.5. 实施extra()函数

执行某些操作之前,应调用extra()函数,以便为存储引擎就如何执行特定操作予以提示。

额外调用中的提示实施不是强制性的,大多数存储引擎均返回0:

int ha_tina::extra(enum ha_extra_function operation)

{

DBUG_ENTER("ha_tina::extra");

DBUG_RETURN(0);

}

5.7. 16.9.6. 实施rnd_next()函数

完成表的初始化操作后,MySQL服务器将调用处理程序的rnd_next()函数,每两个扫描行调用1次,直至满足了服务器的搜索条件或到达文件结尾为止,在后一种情况下,处理程序将返回HA_ERR_END_OF_FILE。

6. -------------------------------------------------------------------------------------------------------------------

7. 关闭表close(void)

当MySQL服务器完成表操作时,它将调用close()方法关闭文件指针并释放任何其他资源。

对于使用共享访问方法的存储引擎(如CSV引擎和其他示例引擎中显示的方法),必须将它们自己从共享结构中删除:

int ha_tina::close(void) {   DBUG_ENTER("ha_tina::close");   DBUG_RETURN(free_share(share)); }  对于使用其自己共享管理系统的存储引擎,应使用任何所需的方法,在它们的处理程序中,从已打开表的共享区删除处理程序实例。

8.

9. 16.11. 为存储引擎添加对INSERT的支持write_row()

一旦在你的存储引擎中有了读支持,下一个需要实施的特性是对INSERT语句的支持。有了INSERT支持,存储引擎就能处理WORM(写一次,读多次)应用程序,如用于以后分析的日志和归档应用等。

所有的INSERT操作均是通过write_row()函数予以处理的:

int ha_foo::write_row(byte *buf)  *buf参数包含将要插入的行,采用内部MySQL格式。基本的存储引擎将简单地前进到数据文件末尾,并直接在末尾处添加缓冲的内容,这样就能使行读取变得简单,这是因为,你可以读取行并将其直接传递到rnd_next()函数的缓冲参数中。

10. 16.12. 为存储引擎添加对UPDATE的支持update_row()

通过执行表扫描操作,在找到与UPDATE语句的WHERE子句匹配的行后,MySQL服务器将执行UPDATE语句,然后调用update_row()函数:

int ha_foo::update_row(const byte *old_data, byte *new_data)*old_data参数包含更新前位于行中的数据,而*new_data参数包含行的新内容(采用MySQL内部行格式)。

更新的执行取决于行格式和存储实施方式。某些存储引擎将替换恰当位置的数据,而其他实施方案则会删除已有的行,并在数据文件末尾添加新行。

非事务性存储引擎通常会忽略*old_data参数的内容,仅处理*new_data缓冲。事务性存储引擎可能需要比较缓冲,以确定在上次回滚中出现了什么变化。

如果正在更新的表中包含时间戳列,对时间戳的更新将由update_row()调用管理。下述示例来自CSV引擎:

11. 16.13. 为存储引擎添加对DELETE的支持delete_row()

MySQL服务器采用了与INSERT语句相同的方法来执行DELETE语句:服务器使用rnd_next()函数跳到要删除的行,然后调用delete_row()函数删除行。

12. 16.14. API引用 与详细说明

16.14.1. bas_ext

16.14.2. close

16.14.3. create

16.14.4. delete_row

16.14.5. delete_table

16.14.6. external_lock

16.14.7. extra

16.14.8. info

16.14.9. open

16.14.10. rnd_init

16.14.11. rnd_next

16.14.12. store_lock

16.14.13. update_row

16.14.14. write_row

16.14.1. bas_ext

13.

14. 参考

这是MySQL参考手册的翻译版本,关于MySQL参考手册,请访问dev.mysql.com。

原始参考手册为英文版,与英文版参考手册相比,本翻译版可能不是最新的。

MySQL 51简体中文手册 第16章:编写自定义存储引擎 南京廖华.htm

Atitit.自定义存储引擎的接口设计 api 标准化 attilax 总结  mysql的更多相关文章

  1. Atitit.数据库存储引擎的原理与attilax 总结

    Atitit.数据库存储引擎的原理与attilax 总结 1. 存储引擎是什么1 2. 其它数据库系统(包括大多数商业选择)仅支持一种类型的数据存储2 3. 表的存储有三个文件:结构+数据+索引2 4 ...

  2. Atitit.数据库存储引擎的原理与attilax 总结

    Atitit.数据库存储引擎的原理与attilax 总结 1. 存储引擎是什么1 2. 其它数据库系统(包括大多数商业选择)仅支持一种类型的数据存储2 3. 表的存储有三个文件:结构+数据+索引2 4 ...

  3. 【大白话系列】MySQL 学习总结 之 初步了解 InnoDB 存储引擎的架构设计

    一.存储引擎 上节我们最后说到,SQL 的执行计划是执行器组件调用存储引擎的接口来完成的. 那我们可以理解为:MySQL 这个数据库管理系统是依靠存储引擎与存放数据的磁盘文件进行交互的. 那么 MyS ...

  4. 干货!MySQL 的 InnoDB 存储引擎是怎么设计的?

    MySQL 里还有什么其他成员呢? 对于 MySQL,要记住.或者要放在你随时可以找到的地方的两张图,一张是 MySQL 架构图,另一张则是 InnoDB 架构图: 遇到问题,或者学习到新知识点时,就 ...

  5. Atitit 数据存储视图的最佳实际best practice attilax总结

    Atitit 数据存储视图的最佳实际best practice attilax总结 1.1. 视图优点:可读性的提升1 1.2. 结论  本着可读性优先于性能的原则,面向人类编程优先于面向机器编程,应 ...

  6. Atitit  数据存储的分组聚合 groupby的实现attilax总结

    Atitit  数据存储的分组聚合 groupby的实现attilax总结 1. 聚合操作1 1.1. a.标量聚合 流聚合1 1.2. b.哈希聚合2 1.3. 所有的最优计划的选择都是基于现有统计 ...

  7. MySQL性能调优与架构设计——第3章 MySQL存储引擎简介

    第3章 MySQL存储引擎简介 3.1 MySQL 存储引擎概述 MyISAM存储引擎是MySQL默认的存储引擎,也是目前MySQL使用最为广泛的存储引擎之一.他的前身就是我们在MySQL发展历程中所 ...

  8. MySQL性能调优与架构设计——第11章 常用存储引擎优化

    第11章 常用存储引擎优化 前言: MySQL 提供的非常丰富的存储引擎种类供大家选择,有多种选择固然是好事,但是需要我们理解掌握的知识也会增加很多.每一种存储引擎都有各自的特长,也都存在一定的短处. ...

  9. 第 3 章 MySQL 存储引擎简介

    第 3 章 MySQL 存储引擎简介 前言 3.1 MySQL 存储引擎概述 MyISAM 存储引擎是 MySQL 默认的存储引擎,也是目前 MySQL 使用最为广泛的存储引擎之一.他的前身就是我们在 ...

随机推荐

  1. 14、Flask实战第14天:Flask使用SQLAlchemy

    flask-sqlalchemy使用详解 之前我们用到的SQLAchemy是可以单独使用的,不需要用到Flask 如果我们在Flask框架中使用SQLAchemy,可以使用flask_sqlalche ...

  2. CSS中的层叠、特殊性、继承、样式表中的@import

    CSS中的层叠.特殊性.继承.样式表中的@import 层叠 CSS有一个机制是层叠,层叠可以理解为对样式的覆盖,优先性为: 网站开发者的样式表 用户样式(通过设置浏览器的显示选项) 浏览器默认的样式 ...

  3. 【动态规划】【记忆化搜索】【搜索】CODEVS 1262 不要把球传我 2012年CCC加拿大高中生信息学奥赛

    可以暴力递归求解,应该不会TLE,但是我们考虑记忆化优化. 设f(i,j)表示第i个数为j时的方案数. f(i,j)=f(1,j-1)+f(2,j-1)+……+f(i-1,j-1) (4>=j& ...

  4. 【动态规划】【最短路】【spfa】bzoj1207 [HNOI2004]打鼹鼠

    <法一>若打了一只鼹鼠后,还能打另一只,我们可以在它们之间连权值为1的边.于是答案就是 以m为终点的最长路长度+1.建反图,就是单源最长路. MLE TLE 一时爽. #include&l ...

  5. 利用Java位运算符,完成Unsigned转换(无符号)

    方案二:利用Java位运算符,完成Unsigned转换. 正常情况下,Java提供的数据类型是有符号signed类型的,可以通过位运算的方式得到它们相对应的无符号值,参见几个方法中的代码: publi ...

  6. C#调用页面中的窗体中的方法,获取窗体的元素。

    页面中的窗体 <div class="div_width" style="width: 100%; height: 95%;"> <ifram ...

  7. css自动换行与不换行

    1.自动换行 div{ word-wrap: break-word; word-break: normal; } 2.不换行 div{ white-space:nowrap; } 3.浮动效果不换行 ...

  8. js循环遍历的两种方法for循环和for ... in 循环

    JS数组的遍历方法有两种: 第一种:一般的for循环,例如: var a = new Array("first", "second", "third& ...

  9. [Android Traffic] 看无线电波如何影响网络操作]

    转载自: http://blog.csdn.net/kesenhoo/article/details/7391031 Optimizing Downloads for Efficient Networ ...

  10. [Android Pro] 通过Android trace文件分析死锁ANR

    转载自: http://blog.csdn.net/oujunli/article/details/9102101#reply 对于从事Android开发的人来说,遇到ANR(Application ...