文档首页
MySQL 8.4 参考手册
相关文档 下载本手册

MySQL 8.4 参考手册  /  ...  /  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_cHANDLER 语句可以为索引中的所有三列指定值,也可以为最左侧前缀中的列指定值。例如

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