文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  HANDLER 语句

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

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

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

第一个 HANDLER ... READ 语法获取索引指定值满足给定值且满足 WHERE 条件的行。 如果您有多列索引,请将索引列值指定为逗号分隔的列表。 为索引中的所有列指定值,或为索引列的最左侧前缀指定值。 假设索引 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 接口来引用表的 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 语句

  • HANDLERSELECT 快。

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

    • 涉及的解析更少。

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

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

  • HANDLER 使得将使用低级 ISAM 类接口的应用程序移植到 MySQL 变得更加容易。

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

HANDLER 是一个有点低级的语句。 例如,它不提供一致性。 也就是说,HANDLER ... OPEN 获取表的快照,也 锁定表。 这意味着在发出 HANDLER ... OPEN 语句后,可以修改表数据(由当前会话或其他会话修改),并且这些修改对于 HANDLER ... NEXTHANDLER ... PREV 扫描可能只是部分可见的。

打开的处理程序可以关闭并标记为重新打开,在这种情况下,处理程序会丢失它在表中的位置。 当以下两种情况都为真时,就会发生这种情况

  • 任何会话对处理程序的表执行 FLUSH TABLES 或 DDL 语句。

  • 处理程序所在的会话执行使用表的非 HANDLER 语句。

表的 TRUNCATE TABLE 会关闭使用 HANDLER OPEN 打开的该表的所有处理程序。

如果使用 FLUSH TABLES tbl_name WITH READ LOCK 刷新了使用 HANDLER 打开的表,则该处理程序会被隐式刷新并丢失其位置。