HANDLER語(yǔ)法
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
HANDLE語(yǔ)句提供了直接訪問(wèn)存儲(chǔ)引擎的接口。對(duì)于innodb和myism表都是可用的。
HANDLER ... OPEN
語(yǔ)句會(huì)打開(kāi)一個(gè)表,使其能夠用后續(xù)的HANDLER ... READ
語(yǔ)句訪問(wèn)。這個(gè)表不能和其他會(huì)話共享直到HANDLER ... CLOSE
或會(huì)話關(guān)閉刽宪。
如果使用別名打開(kāi)表,后續(xù)在使用HANDLER語(yǔ)句打開(kāi)表必須使用別名而不能用原表名界酒。如果不使用別名圣拄,而是使用帶有數(shù)據(jù)庫(kù)名前綴的表名,后續(xù)引用需要去掉數(shù)據(jù)庫(kù)名毁欣。例如庇谆,使用mydb.mytable,后續(xù)引用需使用mytable。
第一個(gè)HANDER ... READ語(yǔ)法獲取的是特定索引滿足給定值并且滿足where條件的行署辉。如果是多列索引族铆,給定的索引列值應(yīng)該是用逗號(hào)隔開(kāi)的列表。要么指定索引中所有列的值哭尝,要么指定索引列中的最左邊的不幾列哥攘。如果索引my_idx包含col_a,col_b,col_c。HANDLER
語(yǔ)句可以指定索引中的全部三個(gè)列值材鹦,或者是最左邊的幾列逝淹。例如:
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
):
HANDLER tbl_name READ `PRIMARY` ...
第二個(gè)HANDLER ... READ
語(yǔ)法表示按照索引的某種順序來(lái)按照where條件篩選結(jié)果行
第三個(gè)HANDLER ... READ
語(yǔ)法表示按照表中行的自然順序匹配where條件。當(dāng)需要全表掃描來(lái)獲取每一行時(shí)(結(jié)果行足夠多)桶唐,比第一栅葡、二種使用索引方式都要更快。實(shí)際上尤泽,自然行順序就是數(shù)據(jù)行在MyISAM表數(shù)據(jù)文件中的存放順序欣簇。這條語(yǔ)句對(duì)于InnoDB表同樣適用,但是不存在這樣的概念坯约,因?yàn)闆](méi)有獨(dú)立的數(shù)據(jù)文件熊咽。
若沒(méi)有LIMIT子句,所有HANDLER ... READ
形式的語(yǔ)句都最多只會(huì)獲取一行闹丐。要返回多少行横殴,就LIMIT多少。
HANDLER ... CLOSE
用于關(guān)閉用HANDLER ... OPEN
打開(kāi)的表卿拴。
為什么使用HANDLER接口衫仑?
- HANDLER更快
-
HANDLER ... OPEN
可以分配特定存儲(chǔ)引擎的句柄對(duì)象梨与。這個(gè)句柄對(duì)象可以被后續(xù)HANDLER(關(guān)閉之前的)語(yǔ)句重用;不需要每次都初始化文狱。 - 語(yǔ)句解析更少
- 不需要優(yōu)化器或查詢檢查等額外消耗
- handler接口不必提供數(shù)據(jù)的一致性查看(例如粥鞋,允許臟讀),因此存儲(chǔ)引擎是可以實(shí)現(xiàn)select語(yǔ)句正常情況下不允許使用的執(zhí)行計(jì)劃瞄崇。
-
- HANDLER使得使用低層類ISAM接口的應(yīng)用可以很輕松地和Mysql對(duì)接陷虎。
- HANDLER讓你可以以一種對(duì)于select語(yǔ)句很難(甚至不可能)的方式來(lái)詳細(xì)研究數(shù)據(jù)庫(kù)。HANDLER接口是一種更自然的方式來(lái)查看數(shù)據(jù)
HANDLER從某種意義上講是一種更低層的語(yǔ)言杠袱。例如,它不提供一致性窝稿。也就是說(shuō)楣富,HANDLER ... OPEN
語(yǔ)句不會(huì)使用表的快照,并且不會(huì)鎖表伴榔。這意味著HANDLER ... OPEN
語(yǔ)句執(zhí)行之后纹蝴,表數(shù)據(jù)可以被修改(當(dāng)前會(huì)話或其他會(huì)話)并且這些修改中的一部分可能被HANDLER ... NEXT
或者HANDLER ... PREV
掃描。
一個(gè)打開(kāi)的handler可以被關(guān)閉然后重新打開(kāi)踪少,這種情況下handler會(huì)丟失表中的位置塘安。下面的兩個(gè)場(chǎng)景中都會(huì)發(fā)生這樣的情況:
- 任何會(huì)話執(zhí)行了
FLUSH TABLES
(經(jīng)驗(yàn)證,只有當(dāng)前會(huì)話可以FLUSH TABLES
)或者對(duì)handler打開(kāi)的表執(zhí)行了DDL語(yǔ)句 - 會(huì)話在handler在打開(kāi)的時(shí)候執(zhí)行了使用該表的non-handler語(yǔ)句
TRUNCATE TABLE
會(huì)關(guān)閉用HANDER OPEN
打開(kāi)的表上所有handlers援奢。
如果一張用HANDLER打開(kāi)的表被FLUSH TABLES tbl_name WITH READ LOCK
flushed兼犯,handler會(huì)被隱式flushed并且丟失位置