HANDLER语句
HANDLER tbl_nameOPEN [ [AS ] alias]HANDLER tbl_nameREAD index_name { = | <= | >= | < | > } (value1,value2,...) [WHERE where_condition ] [LIMIT ... ]HANDLER tbl_nameREAD index_name {FIRST |NEXT |PREV |LAST } [WHERE where_condition ] [LIMIT ... ]HANDLER tbl_nameREAD {FIRST |NEXT } [WHERE where_condition ] [LIMIT ... ]HANDLER tbl_nameCLOSE
该HANDLER
语句提供对表存储引擎接口的直接访问。可用于InnoDB
和MyISAM
表。
该HANDLER ... OPEN
语句打开一个表,使其可以使用后续HANDLER ... READ
语句访问。该表对象未被其他会话共享,并且在会话调用HANDLER ... CLOSE
或会话终止之前不会关闭。
如果使用别名打开表,则其他HANDLER
语句对打开的表的进一步引用必须使用别名而不是表名。如果不使用别名,而是使用数据库名限定的表名打开表,则其他引用必须使用非限定的表名。例如,对于使用打开的表mydb.mytable
,必须使用进一步的引用mytable
。
第一种HANDLER ... READ
语法提取一行,其中指定的索引满足给定值并且满足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_nameREAD `PRIMARY ` ...
第二种HANDLER ... READ
语法以匹配WHERE
条件的索引顺序从表中获取一行。
第三种HANDLER ... READ
语法以符合WHERE
条件的自然行顺序从表中获取一行。它比需要进行全表扫描的速度更快。自然行顺序是在表数据文件中存储行的顺序。该语句也适用于表,但是没有这样的概念,因为没有单独的数据文件。HANDLER tbl_name READ index_name
MyISAM
InnoDB
如果没有LIMIT
子句,则所有形式都将HANDLER ... READ
提取一行(如果有的话)。要返回特定数量的行,请包含一个LIMIT
子句。它具有与SELECT
语句相同的语法。请参见“ SELECT语句”。
HANDLER ... CLOSE
关闭以打开的表HANDLER ... OPEN
。
使用HANDLER
接口而不是常规SELECT
语句有多种原因:
HANDLER
快于SELECT
:- 为分配了一个指定的存储引擎处理程序对象
HANDLER ... OPEN
。该对象可HANDLER
用于该表的后续语句;它不需要为每个重新初始化。 - 涉及的解析较少。
- 没有优化程序或查询检查开销。
- 处理程序接口不必提供一致的数据外观(例如,允许脏读取),因此存储引擎可以使用
SELECT
通常不允许的优化。
- 为分配了一个指定的存储引擎处理程序对象
HANDLER
可以更轻松地移植到使用类似底层ISAM
接口的MySQL应用程序。(有关适应使用键值存储范例的应用程序的另一种方法,请参见“ InnoDB memcached插件”。)HANDLER
使您能够以难以(甚至不可能)完成的方式遍历数据库SELECT
。HANDLER
当使用为数据库提供交互式用户界面的应用程序时,该界面是参见数据的更自然的方式。
HANDLER
是一个有点低级的陈述。例如,它不提供一致性。也就是说,HANDLER ... OPEN
它不走表的快照,并不能锁定表。这意味着在发出HANDLER ... OPEN
语句之后,可以修改表数据(通过当前会话或其他会话),并且这些修改可能仅对扫描HANDLER ... NEXT
或部分可见HANDLER ... PREV
。
可以关闭一个打开的处理程序并将其标记为重新打开,在这种情况下,处理程序将丢失其在表中的位置。当同时满足以下两种情况时,会发生这种情况:
- 任何会话
FLUSH TABLES
在处理程序的表上执行或执行DDL语句。 - 打开处理程序的会话将执行
HANDLER
使用表的非语句。
TRUNCATE TABLE
对于一个表,将关闭用打开的表的所有处理程序HANDLER OPEN
。
如果使用打开了刷新表,则处理程序将隐式刷新,并失去其位置。FLUSH TABLES tbl_name WITH READ LOCK
HANDLER