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
打开的表,则该处理程序会被隐式刷新并丢失其位置。