MySQL存储引擎接口

MySQL提供了访问不同的存储引擎数据表的虚拟层API。过去,这些接口被称之为"table handler".现在有了新的介绍——storage engine.目前我们所提到的storage engine,往往是与存储/读取数据的相关代码,而table handler指的是storage engine与MySQL优化器的接口.

抽象接口极大地促进MySQL加入其它存储引擎的步伐,抽象接口在v3.22提升到v3.23时引入的设计。在快速集成InnoDB存储引擎阶段中起了很大的帮助,众所周知,InnoDB为MySQL带来了稳定事务支持、多版本、行锁。只要知道怎么读写记录,任何东西都可以很快的集成到MySQL中。

接口通过抽象类handler来实现,handler类提供如打开/关闭table,扫表,查询Key数据,写记录跟删除记录等基础操作方法。每一个存储引擎通过继承handler类,实现以上提到的方法,在方法里面实现对底层存储引擎的读写接口的转调。从5.0版本开始,为了避免在初始化/事务提交/保存事务点/回滚操作时需要操作one-table实例,引入了handlerton结构让存储引擎提供了发生上面提到操作时的钩子操作。

下面主要讲handler类和handlerton结构体,并提供一个实例,读取逗号分隔符格式文件的简单存储引擎。

handler类
定义于sql/handler.h、sql/handler.cc
handler类从Sql_alloc继承,Sql_alloc没有任何成员变量,纯粹重载了new和delete操作。所以handler类分配内存是可以从连接相关的内存池来分配。而delete操作时不做任何事情。内存的释放只会在mysys/my_alloc.c的free_root()调用发生。无需显性去释放,在语句执行之后清理。

每一个table描述符对应一个handler的实例。注意针对同一个table可能会被打开多次的情况,这时候会出现多个handler实例。5.0版本引入index_merge方法后导致了一些有趣的方式,以前多个handler实例只会在table cache中拷贝描述符产生,引入Index_merge之后,handler实例可能会在优化阶段被创建。

handler类成员变量
st_table*: 与handler实例相关的table描述符.
byte* ref: 保存当前记录。存储引擎类型不同,这个字段表示的意义不同。
     MyISAM: 在data-file里面的offset InnoDB:primary key MEMORY:Point
ulonglong auto_increment_value;
ulong mean_rec_length; 记录平均长度,SHOW TABLE STATUS

handler类成员函数(暂略)

handlerton
4.1之前的版本,从handler类继承是唯一一个存储引擎可以与核心结构交互的途径。
当优化器需要针对存储引擎做一些事情的时候,只可能调用当前table相关的handler实例的接口方法。但是随着集成多种存储引擎的发展,尽是靠handler方法来交互的形式是不太够的,因此,handlerton概念诞生。

handlerton是一个几乎全是回掉方法指针的C结构体。定义在sql/handler.h
回调函数在某一事件发生时针对具体的存储引擎被调用(事务提交/保存事务点/连接关闭等)


如何添加第三方存储引擎

5.1之后版本添加变得简单多。可以根据"blackhole"存储引擎的模式来改造
1、创建目录 storage/xx-csv,实际文件ha_csv.h(cc)移至该目录
2、Makefile.am 放入storage/xx-csv
3、configure.in 改写MYSQL_STORAGE_ENGINE宏
4、autoconf & automake & ./configure --prefix=/usr --with-plugins=xx-csv & make

mysql_declare_plugin宏注册引擎

读写支持的存储引擎需要面对更多问题,多个handler实例会被创建,发现多个写实例的存在会导致写入位置发生一些奇怪的现象,这或许会让我们感到惊讶。其他存储引擎通过共享底层的表描述符结构体来解决这个问题。

sql/examples/ha_tina.cc更为详细的引擎实现方式

你可能感兴趣的:(MySQL)