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
陳述式相同。請參閱 第 15.2.13 節「SELECT 陳述式」。
HANDLER ... CLOSE
會關閉使用 HANDLER ... OPEN
開啟的資料表。
使用 HANDLER
介面而不是一般 SELECT
陳述式有幾個原因:
HANDLER
是一個稍微低階的陳述式。例如,它不提供一致性。也就是說,HANDLER ... OPEN
不會 取得資料表的快照,且 不會 鎖定資料表。這表示在發出 HANDLER ... OPEN
陳述式後,可以修改資料表資料(由目前的工作階段或其他工作階段),並且這些修改可能僅部分可見於 HANDLER ... NEXT
或 HANDLER ... PREV
掃描。
開啟的處理器可以關閉並標記為重新開啟,在這種情況下,處理器會遺失其在資料表中的位置。當下列兩種情況都成立時,就會發生這種情況:
任何工作階段對處理器的資料表執行
FLUSH TABLES
或 DDL 陳述式。開啟處理器的工作階段執行使用資料表的非
HANDLER
陳述式。
資料表的 TRUNCATE TABLE
會關閉所有使用 HANDLER OPEN
開啟的資料表處理器。
如果資料表使用 FLUSH TABLES
清除,並且已使用 tbl_name
WITH READ LOCKHANDLER
開啟,則該處理器會被隱含地清除並遺失其位置。