MySQL的SQL語句 - 數據操做語句(4)- HANDLER 語句

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_acol_b 和 col_cHANDLER 語句能夠爲索引中的全部三列或最左邊前綴中的列指定值。例如:  



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 刷新,則句柄將隱式刷新並失去其位置。
相關文章
相關標籤/搜索