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
比SELECT
快速:-
一个指定的存储引擎处理器对象将被分配给
HANDLER ... OPEN
。该对象将被重用以后的HANDLER
语句;它不需要为每个语句重新初始化。 -
解析涉及较少。
-
没有优化器或查询检查开销。
-
处理器接口不需要提供数据的一致外观(例如,允许 dirty reads),因此存储引擎可以使用优化,
SELECT
不允许这些优化。
-
-
HANDLER
使得将 MySQL 应用程序移植到使用低级ISAM
-like 接口变得更容易。 -
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 LOCK