13.2.4 HANDLER 语句

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语句提供对 table 存储引擎接口的直接访问。它可用于InnoDBMyISAMtable。

HANDLER ... OPEN语句打开一个 table,使其可以使用后续的HANDLER ... READ语句进行访问。该 table 对象未被其他会话共享,并且在会话调用HANDLER ... CLOSE或会话终止之前不会关闭。

如果使用别名打开 table,则其他HANDLER语句对打开的 table 的进一步引用必须使用别名而不是 table 名。如果您不使用别名,而是使用数据库名称限定的 table 名称打开 table,则其他引用必须使用非限定的 table 名称。例如,对于使用mydb.mytable打开的 table,其他引用必须使用mytable

第一种HANDLER ... READ语法会获取一行,其中指定的索引满足给定值,并且满足WHERE条件。如果您有多列索引,则将索引列值指定为以逗号分隔的列 table。为索引中的所有列指定值,或者为索引列的最左前缀指定值。假设索引my_idx依次包含三个名为col_acol_bcol_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接口引用 table 的PRIMARY KEY,请使用带引号的标识符```+45+`'':

HANDLER tbl_name READ `PRIMARY` ...

第二种HANDLER ... READ语法以与WHERE条件匹配的索引 Sequences 从 table 中获取一行。

第三种HANDLER ... READ语法以与WHERE条件匹配的自然行 Sequences 从 table 中获取一行。当需要全 table 扫描时,它比HANDLER tbl_name READ index_name快。自然行 Sequences 是在MyISAMtable 数据文件中存储行的 Sequences。该语句也适用于InnoDBtable,但是没有这样的概念,因为没有单独的数据文件。

如果没有LIMIT子句,则所有HANDLER ... READ形式都将获取一行。要返回特定数量的行,请包含LIMIT子句。它具有与SELECT语句相同的语法。参见第 13.2.9 节“ SELECT 语句”

HANDLER ... CLOSE关闭使用HANDLER ... OPEN打开的 table。

使用HANDLER接口而不是普通的SELECT语句有多种原因:

  • HANDLERSELECT快:

  • HANDLER ... OPEN分配了一个指定的存储引擎处理程序对象。该对象可用于该 table 的后续HANDLER语句;它不需要为每个重新初始化。

    • 涉及的解析较少。

    • 没有优化程序或查询检查开销。

    • 处理程序接口不必提供一致的数据外观(例如,允许dirty reads),因此存储引擎可以使用SELECT通常不允许的优化。

  • HANDLER使得移植到使用类似ISAM的底层接口的 MySQL 应用程序更加容易。 (有关适应使用键值存储范例的应用程序的另一种方法,请参阅第 14.21 节“ InnoDB memcached 插件”。)

  • HANDLER使您可以用SELECT难以(甚至不可能)遍历数据库。当使用为数据库提供交互式用户界面的应用程序时,HANDLER界面是查看数据的更自然的方式。

HANDLER是一个较低级别的语句。例如,它不提供一致性。也就是说,HANDLER ... OPEN不会 为 table 创建快照,并且 *不会锁定 table。这意味着发出HANDLER ... OPEN语句后,可以修改 table 数据(通过当前会话或其他会话),并且这些修改对于HANDLER ... NEXTHANDLER ... PREV扫描可能仅部分可见。

可以关闭一个打开的处理程序并将其标记为重新打开,在这种情况下,处理程序将丢失其在 table 中的位置。当同时满足以下两种情况时,会发生这种情况:

  • 任何会话都在处理程序的 table 上执行FLUSH TABLES或 DDL 语句。

  • 打开处理程序的会话将执行使用 table 的非HANDLER语句。

table 格的TRUNCATE TABLE关闭使用HANDLER OPEN打开的 table 格的所有处理程序。

如果用刷新 tabletbl_name 具有读取锁定刷新的 table 是用HANDLER打开的,则处理程序将隐式刷新,并丢失其位置。