15.2.5 处理程序语句
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 语句必须使用别名,而不是表名。如果您没有使用别名,但打开表使用带有数据库名称的表名,后续引用必须使用未qualified 表名。例如,对于使用 mydb.mytable 打开的表,后续引用必须使用 mytable。
HANDLER ... READ 语句的第一个语法 fetches 一行,其中指定的索引满足给定的值,并且 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
更快,当需要全表扫描时。自然行顺序是 MyISAM 表数据文件中行的存储顺序。这条语句也适用于 InnoDB 表,但由于没有单独的数据文件,所以没有这种概念。tbl_name
READ index_name
没有 LIMIT
子句,所有形式的 HANDLER ... READ
都会 fetch 单个行,如果有可用。要返回特定的行数,请包括 LIMIT
子句。它的语法与SELECT
语句相同。请参阅第15.2.13节,“SELECT 语句”。
HANDLER ... CLOSE
关闭使用 HANDLER ... OPEN
打开的表。
有多种原因可以使用 HANDLER
接口,而不是正常的SELECT
语句:
-
HANDLER
比SELECT
更快:-
为
HANDLER ... OPEN
分配一个指定的存储引擎处理对象。该对象将被重复使用,以便于后续对同一张表的HANDLER
语句;不需要在每个语句中重新初始化。 -
涉及到的解析工作较少。
-
没有优化器或查询检查开销。
-
处理接口不需要提供数据的一致外观(例如脏读),因此存储引擎可以使用
SELECT
通常不允许的优化。
-
-
HANDLER
使得将 MySQL 应用程序移植到使用低级别 ISAM 类似接口的应用程序变得更容易。 -
HANDLER
使得您可以以一种难以或甚至无法使用SELECT
语句来遍历数据库的方式。HANDLER
接口是更自然地查看数据时,工作于提供交互式用户界面到数据库的应用程序时的方法。
HANDLER
语句是一种较低级别的语句。例如,它不提供一致性。即使是HANDLER ... OPEN
语句,也不会对表格拍摄快照,也不会锁定表格。这意味着,在执行HANDLER ... OPEN
语句后,当前会话或其他会话可以修改表格数据,并且这些修改可能只部分可见于HANDLER ... NEXT
或HANDLER ... PREV
扫描。
打开的处理器可以被关闭并标记为重新打开,这时处理器将失去对表格的位置。这是因为满足以下两个条件时发生的:
-
任何会话执行
FLUSH TABLES
或DDL语句于处理器的表格上。 -
打开处理器的会话执行非
HANDLER
语句,该语句使用表格。
TRUNCATE TABLE
语句对一个表格关闭所有以HANDLER OPEN
打开的处理器。
如果使用FLUSH TABLES
语句对表格进行刷新,并且该表格以tbl_ name
WITH READ LOCKHANDLER
打开,那么处理器将隐式地被刷新并失去其位置。