Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


15.2.5 处理程序语句

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 语句必须使用别名,而不是表名。如果您没有使用别名,但打开表使用带有数据库名称的表名,后续引用必须使用未qualified 表名。例如,对于使用 mydb.mytable 打开的表,后续引用必须使用 mytable。

HANDLER ... READ 语句的第一个语法 fetches 一行,其中指定的索引满足给定的值,并且 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 都会 fetch 单个行,如果有可用。要返回特定的行数,请包括 LIMIT 子句。它的语法与SELECT 语句相同。请参阅第15.2.13节,“SELECT 语句”

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

有多种原因可以使用 HANDLER 接口,而不是正常的SELECT 语句:

  • HANDLERSELECT更快:

    • HANDLER ... OPEN分配一个指定的存储引擎处理对象。该对象将被重复使用,以便于后续对同一张表的HANDLER语句;不需要在每个语句中重新初始化。

    • 涉及到的解析工作较少。

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

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

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

  • 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打开,那么处理器将隐式地被刷新并失去其位置。