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
開啟的,則處理常式會被隱含地清除並失去其位置。