程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> 如何寫MySQL存儲引擎

如何寫MySQL存儲引擎

編輯:關於MYSQL數據庫

  在MySQL 5.1中開發一個存儲引擎已經是比較方便了。所謂存儲引擎實際上是按照MySQL的約定,提供某些接口的實現而已,如MySQL插入一條記錄時將調用write_row方法,通過索引檢索時將調用index_read和index_next方法等。MySQL與存儲引擎之間的接口主要由兩個類/結構約定,分別是在sql/handler.h中定義的handlerton結構和handler類。handlerton結構主要是約定事務操作接口,handler類主要約定表、索引及記錄操作接口。對不支持事務的存儲引擎只需要創建一個handler的派生類,並重載該引擎需要支持的方法。對於需要支持事務的存儲引擎,還需要實現handlerton結構中指定的接口。

  實現了存儲引擎本身功能後,還需要按一定格式“聲明”一下存儲引擎的存在。首先需要定義一個類型為st_mysql_storage_engine的變量,其值為MySQL_HANDLERTON_INTERFACE_VERSION。如下所示:

struct st_MySQL_storage_engine foo_storage_engine=
{ MySQL_HANDLERTON_INTERFACE_VERSION };


  然後需要用MySQL_declare_plugin宏來給出存儲引擎的聲明,如下所示:

MySQL_declare_plugin(foo)          /* foo為存儲引擎名稱 */
{
 MySQL_STORAGE_ENGINE_PLUGIN,
 &foo_storage_engine,            /* 這裡即為上面定義的st_MySQL_storage_engine變量 */
 "FOO",                        /* SHOW ENGINES中顯示的存儲引擎名稱 */
 "Author Here",                  /* 作者名 */
 "Foo storage engine",            /* SHOW ENGINES中顯示的存儲引擎說明 */
 PLUGIN_LICENSE_GPL,
 init_func,              /* 某函數,將在加載存儲引擎時調用 */
 done_func,              /* 某函數,將在卸載存儲引擎時調用 */
 0x0001 /* 版本號0.1 */,
 NULL,                     /* status variables */
 NULL,                     /* system variables */
 NULL                     /* config options */
}
MySQL_declare_plugin_end;

  照此聲明後,在加載存儲引擎時MySQL將調用init_func函數,此時會傳入一個handlerton變量,存儲引擎至少需要設置其中的 state、db_type、create、flags等屬性,其中create為一函數指針,將隨後被調用。若存儲引擎支持事務,則還需要設置 handlerton中事務接口函數指針指向相應的實現函數。

  然後MySQL調用上面設置的create函數,該函數中,存儲引擎實現者構建一個該引擎對應的handler派生類實例並返回給 MySQL。至此存儲引擎初始化過程完成,存儲引擎與MySQL之間的接口也已經確定,此後MySQL即會在相應的時刻調用handlerton結構或 handler類約定的方法。

  MySQL源代碼中的storage/example目錄給出了很好的示例,該目錄實現了一個“最小”的存儲引擎EXAMPLE,只是能加載進來玩玩,不能用來存儲記錄。開發新的存儲引擎時,最方便的方法也是拷貝一份example的代碼來改。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved