MYSQL使用記錄之:handler

qqmengxue發表於2010-11-03
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語句提供通往表儲存引擎介面的直接通道。HANDLER可以用於MyISAMInnoDB表。

[@more@]

HANDLER...OPEN語句用於開啟一個表,透過後續的HANDLER...READ語句建立讀取表的通道。

本表目標不會被其它執行緒共享,也不會關閉,直到執行緒呼叫HANDLER...CLOSE或執行緒中止時為止。

如果您使用一個別名開啟表,則使用其它HANDLER語句進一步參閱表是必須使用此別名,而不能使用表名。

如果被指定的索引滿足給定的值並且符合了WHERE條件,則第一個HANDLER...READ語法取出一行。

如果您有一個多列索引,則指定索引列值為一個用逗號隔開的清單。既可以為索引中的所有列指定值,

也可以為索引列的最左邊的字首指定值。假設一個索引包括三個列,名稱為col_a, col_b,col_c,並按此順序排列。

HANDLER語句可以為索引中的所有三個列指定值,或者為一個最左邊字首中的各列指定值。舉例說明:

HANDLER ... index_name = (col_a_val,col_b_val,col_c_val) ...
HANDLER ... index_name = (col_a_val,col_b_val) ...
HANDLER ... index_name = (col_a_val) ...

第二個HANDLER...READ語法按索引的順序從表中取出一行。索引的順序符合WHERE條件。

第三個HANDLER...READ語法按自然行的順序從表中取出一行。自然行的順序符合WHERE條件。

當想要對整個表進行掃描時,此語句比HANDLER tbl_name READ index_name更快。自然行的順序指的是行儲存在

MyISAM表資料檔案的順序。本語句也適用於InnoDB表,但是因為沒有獨立的資料檔案,所以沒有這類概念。

不使用LIMIT子句時,所有形式的HANDLER...READ語句均只取出一行。 如果要返回多個行,應加入一個LIMIT子句。本語句於

SELECT語句的語法一樣。請參見13.2.7節,“SELECT語法”

HANDLER...CLOSE用於關閉使用HANDLER...OPEN開啟的表。

註釋:要使用HANDLER介面來查閱一個表的PRIMARY KEY,應使用帶引號的識別符`PRIMARY`

HANDLER tbl_name READ `PRIMARY` > (...);

HANDLER是比較低階別的語句。例如,它不能提供一致性。也就是說,HANDLER...OPEN不能為表做快照,也不能鎖定表。這意味著,

當一個HANDLER...OPEN語句被編寫後,表資料可以被更改(用此執行緒或用其它執行緒),並且這些更改只會部分地出現在HANDLER...NEXTHANDLER...PREV掃描中。

使用HANDLER介面代替常規的SELECT語句有多個原因:

· HANDLERSELECT更快:

o 一個指定的儲存引擎管理程式目標為了HANDLER...OPEN進行整序。該目標被重新用於該表的後續的HANDLER語句;不需要對每個語句進行重新初始化。

o 涉及的分析較少。

o 沒有最佳化程式或查詢校驗開銷。

o 在兩個管理程式請求之間,不需要鎖定表。

o 管理程式介面不需要提供外觀一致的資料(例如,允許無條理的讀取),所以儲存引擎可以使用最佳化,而SELECT通常不允許使用最佳化。

· 有些應用程式使用與ISAM近似的介面與MySQL連線。使用HANDLER可以更容易地與這些應用程式連線。

· HANDLER允許您採用一種特殊的方式進出資料庫。而使用SELECT時難以採用(或不可能採用)這種方式。有些應用程式可以提供一個交

互式的使用者介面與資料庫連線。當與這些應用程式同時使用時,用HANDLER介面觀看資料更加自然。

示例:

mysql> desc test1;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| a | int(11) | YES | MUL | NULL | |
| b | varchar(45) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+

mysql> show index from test1;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| test1 | 1 | ab | 1 | a | A | 4 | NULL | NULL | YES | BTREE | |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
1 row in set (0.00 sec)
mysql> handler test1 open;
Query OK, 0 rows affected (0.00 sec)
mysql> handler test1 read first;
+------+------+
| a | b |
+------+------+
| 1 | 2 |
+------+------+
1 row in set (0.00 sec)

mysql> handler test1 read next;
+------+------+
| a | b |
+------+------+
| 1 | 2 |
+------+------+
1 row in set (0.00 sec)

mysql> handler test1 read next;
+------+------+
| a | b |
+------+------+
| 1 | 2 |
+------+------+
1 row in set (0.00 sec)

mysql> handler test1 read next;
+------+------+
| a | b |
+------+------+
| 3 | 4
|
+------+------+
1 row in set (0.00 sec)

mysql> handler test1 read next;
+------+------+
| a | b |
+------+------+
| 1 | 2 |
+------+------+
1 row in set (0.00 sec)

mysql> handler test1 read next;
+------+------+
| a | b |
+------+------+
| 3 | 4
|
+------+------+
1 row in set (0.00 sec)

mysql> handler test1 read next;
+------+------+
| a | b |
+------+------+
| 3 | 4
|
+------+------+

mysql> handler test1 read next;
Empty set (0.00 sec)

mysql> handler test1 read next;
Empty set (0.00 sec)

mysql> handler test1 read next;
Empty set (0.00 sec)

mysql> handler test1 read next;
Empty set (0.00 sec)

mysql> handler test1 read ab=(1);
+------+------+
| a | b |
+------+------+
| 1 | 2 |
+------+------+
1 row in set (0.00 sec)

mysql> handler test1 read ab=(2);
Empty set (0.00 sec)

mysql> handler test1 read ab=(3);
+------+------+
| a | b |
+------+------+
| 3 | 4
|
+------+------+
1 row in set (0.00 sec)

mysql> handler test1 read ab=(3) limit 10;
+------+------+
| a | b |
+------+------+
| 3 | 4
|
| 3 | 4
|
| 3 | 4
|
| 3 | 4
|
| 3 | 4
|
| 3 | 4
|
| 3 | 4
|
| 3 | 4
|
| 3 | 4
|
| 3 | 4
|
+------+------+
10 rows in set (0.00 sec)

mysql> handler test1 read ab=(3) limit 20;
+------+------+
| a | b |
+------+------+
| 3 | 4
|
| 3 | 4
|
| 3 | 4
|
| 3 | 4
|
| 3 | 4
|
| 3 | 4
|
| 3 | 4
|
| 3 | 4
|
| 3 | 4
|
| 3 | 4
|
+------+------+
10 rows in set (0.00 sec)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10130206/viewspace-1040833/,如需轉載,請註明出處,否則將追究法律責任。

相關文章