mysql标准化存储结构_Atitit.自定义存储引擎的接口设计 api 标准化 attilax 总结 mysql...
Atitit.自定義存儲引擎的接口設計api標準化attilax總結mysql
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:[email?protected]
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
原文:http://www.cnblogs.com/attilax/p/5093610.html
總結
以上是生活随笔為你收集整理的mysql标准化存储结构_Atitit.自定义存储引擎的接口设计 api 标准化 attilax 总结 mysql...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 姓郭的有寓意的好名字 好听的姓郭的名字
- 下一篇: 姜继字辈取名的寓意和含义男孩子