Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

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 语句;它不需要为每个语句重新初始化。

    • 解析涉及较少。

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

    • 处理器接口不需要提供数据的一致外观(例如,允许 dirty reads),因此存储引擎可以使用优化,SELECT 不允许这些优化。

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

  • 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 打开了处理程序,处理程序将隐式刷新并失去其位置。