mysql存储引擎使用教程_mysql教程:如何写MySQL存储引擎
在MySQL 5.1中開發(fā)一個(gè)存儲(chǔ)引擎已經(jīng)是比較方便了。所謂存儲(chǔ)引擎實(shí)際上是按照MySQL的約定,提供某些接口的實(shí)現(xiàn)而已,如MySQL插入一條記錄時(shí)將調(diào)用write_row方法,通過索引檢索時(shí)將調(diào)用index_read和index_next方法等。MySQL與存儲(chǔ)引擎之間的接口主要由兩個(gè)類/結(jié)構(gòu)約定,分別是在sql/handler.h中定義的handlerton結(jié)構(gòu)和handler類。handlerton結(jié)構(gòu)主要是約定事務(wù)操作接口,handler類主要約定表、索引及記錄操作接口。對(duì)不支持事務(wù)的存儲(chǔ)引擎只需要?jiǎng)?chuàng)建一個(gè)handler的派生類,并重載該引擎需要支持的方法。對(duì)于需要支持事務(wù)的存儲(chǔ)引擎,還需要實(shí)現(xiàn)handlerton結(jié)構(gòu)中指定的接口。
實(shí)現(xiàn)了存儲(chǔ)引擎本身功能后,還需要按一定格式“聲明”一下存儲(chǔ)引擎的存在。首先需要定義一個(gè)類型為st_mysql_storage_engine的變量,其值為MYSQL_HANDLERTON_INTERFACE_VERSION。如下所示:
struct st_mysql_storage_engine foo_storage_engine=
{ MYSQL_HANDLERTON_INTERFACE_VERSION };
然后需要用mysql_declare_plugin宏來給出存儲(chǔ)引擎的聲明,如下所示:
mysql_declare_plugin(foo) /* foo為存儲(chǔ)引擎名稱 */
{
MYSQL_STORAGE_ENGINE_PLUGIN,
&foo_storage_engine, /* 這里即為上面定義的st_mysql_storage_engine變量 */
"FOO", /* SHOW ENGINES中顯示的存儲(chǔ)引擎名稱 */
"Author Here", /* 作者名 */
"Foo storage engine", /* SHOW ENGINES中顯示的存儲(chǔ)引擎說明 */
PLUGIN_LICENSE_GPL,
init_func, /* 某函數(shù),將在加載存儲(chǔ)引擎時(shí)調(diào)用 */
done_func, /* 某函數(shù),將在卸載存儲(chǔ)引擎時(shí)調(diào)用 */
0x0001 /* 版本號(hào)0.1 */,
NULL, /* status variables */
NULL, /* system variables */
NULL /* config options */
}
mysql_declare_plugin_end;
照此聲明后,在加載存儲(chǔ)引擎時(shí)MySQL將調(diào)用init_func函數(shù),此時(shí)會(huì)傳入一個(gè)handlerton變量,存儲(chǔ)引擎至少需要設(shè)置其中的 state、db_type、create、flags等屬性,其中create為一函數(shù)指針,將隨后被調(diào)用。若存儲(chǔ)引擎支持事務(wù),則還需要設(shè)置 handlerton中事務(wù)接口函數(shù)指針指向相應(yīng)的實(shí)現(xiàn)函數(shù)。
然后MySQL調(diào)用上面設(shè)置的create函數(shù),該函數(shù)中,存儲(chǔ)引擎實(shí)現(xiàn)者構(gòu)建一個(gè)該引擎對(duì)應(yīng)的handler派生類實(shí)例并返回給 MySQL。至此存儲(chǔ)引擎初始化過程完成,存儲(chǔ)引擎與MySQL之間的接口也已經(jīng)確定,此后MySQL即會(huì)在相應(yīng)的時(shí)刻調(diào)用handlerton結(jié)構(gòu)或 handler類約定的方法。
MySQL源代碼中的storage/example目錄給出了很好的示例,該目錄實(shí)現(xiàn)了一個(gè)“最小”的存儲(chǔ)引擎EXAMPLE,只是能加載進(jìn)來玩玩,不能用來存儲(chǔ)記錄。開發(fā)新的存儲(chǔ)引擎時(shí),最方便的方法也是拷貝一份example的代碼來改
總結(jié)
以上是生活随笔為你收集整理的mysql存储引擎使用教程_mysql教程:如何写MySQL存储引擎的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux c mysql教程_linu
- 下一篇: com/mysql/jdbc/sqler