HANDLER 語句
HANDLER tbl_name OPEN [ [AS] alias]
HANDLER tbl_name READ index_name { = | <= | >= | < | > } (value1,value2,...) [ WHERE where_condition ] [LIMIT ... ]HANDLER tbl_name READ index_name { FIRST | NEXT | PREV | LAST } [ WHERE where_condition ] [LIMIT ... ]HANDLER tbl_name READ { FIRST | NEXT } [ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name CLOSE
HANDLER 語句提供對錶存儲引擎接口的直接訪問。它可用於 InnoDB 和MyISAM 表。
HANDLER ... OPEN 語句打開一個表,後續的 HANDLER ... READ 語句能夠訪問它。此表對象不被其餘會話共享,而且直到調用 HANDLER ... CLOSE 或者會話終止纔會關閉。
若是使用別名打開表,使用其餘 HANDLER 語句對打開的表的進一步引用必須使用別名,而不是表名。若是不使用別名,但使用由數據庫名稱限定的表名打開表,則進一步的引用必須使用不限定的表名。例如,使用mydb.mytable 打開的表,進一步引用必須使用 mytable。
第一個 HANDLER ... READ 語法獲取指定索引知足給定值且知足 WHERE條件的行。若是有多列索引,請將索引列值指定爲逗號分隔的列表。爲索引中的全部列指定值,或爲索引列的最左側前綴指定值。假設一個索引my_idx 按順序包含三個列,分別名爲 col_a、col_b 和 col_c。HANDLER 語句能夠爲索引中的全部三列或最左邊前綴中的列指定值。例如:
HANDLER ... READ my_idx = (col_a_val,col_b_val,col_c_val) ...HANDLER ... READ my_idx = (col_a_val,col_b_val) ...HANDLER ... READ my_idx = (col_a_val) ...
要使用 HANDLER 接口引用表的 PRIMARY KEY,請使用帶引號的標識符「PRIMARY」:
HANDLER tbl_name READ `PRIMARY` ...
第二個 HANDLER ... READ 語法按索引順序從表中獲取與 WHERE 條件匹配的行。
第三個 HANDLER ... READ 語法以符合 WHERE 條件的天然行順序從表中獲取行。當須要全表掃描時,它比 HANDLER tbl_name READ index_name語句快。天然行順序是在 MyISAM 表數據文件中存儲行的順序。這個語句也適用於 InnoDB 表,可是沒有這樣的概念,由於沒有單獨的數據文件。
若是沒有 LIMIT 子句,全部形如 HANDLER ... READ 的語句獲取一行(若是存在)。要返回特定數量的行,請包含一個 LIMIT 子句。它的語法與SELECT 語句的語法相同。
HANDLER ... CLOSE 語句關閉用 HANDLER ... OPEN 打開的表。
有如下幾個緣由使用 HANDLER 接口而不是普通的 SELECT 語句:
● HANDLER 比 SELECT 快:
■ 已爲 HANDLER ... OPEN 分配指定的存儲引擎句柄對象。該對象將被重用於該表的後續 HANDLER 語句;不須要爲每一個語句從新初始化它。
■ 所涉及的解析較少。
■ 沒有優化器或查詢檢查開銷。
■ 句柄接口沒必要提供一致的數據外觀(例如,容許髒讀),所以存儲引擎可使用 SELECT 一般不容許的優化。
● HANDLER 語句使得使用低級類 ISAM 接口來遷移到 MySQL 應用程序變得更加容易。
● HANDLER 可以以使用 SELECT 難以(甚至不可能)完成的方式遍歷數據庫。當與應用程序配合爲數據庫提供交互式用戶接口時,HANDLER 接口是查看數據更天然的方式。
HANDLER 在某種程度上是一個有點底層的語句。例如,它不能提供一致性。也就是說,HANDLER ... OPEN 不會獲取表的快照,也不會鎖定表。這意味着在 HANDLER ... OPEN 語句執行時,能夠修改表數據(由當前會話或其餘會話修改),而且這些修改可能僅對 HANDLER ... NEXT 或者 HANDLER ... PREV 掃描部分可見。
打開的句柄能夠被關閉並標記爲從新打開,在這種狀況下,句柄將失去其在表中的位置。當如下兩種狀況都成立時,就會發生這種狀況:
● 任何會話在句柄的表上執行 FLUSH TABLES 或 DDL 語句。
● 打開句柄的會話執行使用表的非 HANDLER 語句。
對一個表執行 TRUNCATE TABLE 語句將關閉使用 HANDLER OPEN 爲這個表打開的全部句柄。
若是用 HANDLER 語句打開的表使用 FLUSH TABLES tbl_name WITH READ LOCK 刷新,則句柄將隱式刷新並失去其位置。