MySQL的SQL语句 - 数据操做语句(4)- HANDLER 语句

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 语句提供对表存储引擎接口的直接访问。它可用于 InnoDB MyISAM 表。   HANDLER ... OPEN 语句打开一个表,后续的 HANDLER ... READ 语句能够访问它。此表对象不被其余会话共享,而且直到调用 HANDLER ... CLOSE 或者会话终止才会关闭。   若是使用别名打开表,使用其余 HANDLER 语句对打开的表的进一步引用必须使用别名,而不是表名。若是不使用别名,但使用由数据库名称限定的表名打开表,则进一步的引用必须使用不限定的表名。例如,使用mydb.mytable 打开的表,进一步引用必须使用 mytable   第一个 HANDLER ... READ 语法获取指定索引知足给定值且知足 WHERE条件的行。若是有多列索引,请将索引列值指定为逗号分隔的列表。为索引中的全部列指定值,或为索引列的最左侧前缀指定值。假设一个索引my_idx 按顺序包含三个列,分别名为 col_acol_b 和 col_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 语句的语法相同。   HANDLER ... CLOSE 语句关闭用 HANDLER ... OPEN 打开的表。   有如下几个缘由使用 HANDLER 接口而不是普通的 SELECT 语句:   ● HANDLER 比 SELECT 快:   ■ 已为 HANDLER ... OPEN 分配指定的存储引擎句柄对象。该对象将被重用于该表的后续 HANDLER 语句;不须要为每一个语句从新初始化它。   ■ 所涉及的解析较少。   ■ 没有优化器或查询检查开销。   ■ 句柄接口没必要提供一致的数据外观(例如,容许脏读),所以存储引擎可使用 SELECT 一般不容许的优化。   ● HANDLER 语句使得使用低级类 ISAM 接口来迁移到 MySQL 应用程序变得更加容易。   ● HANDLER 可以以使用 SELECT 难以(甚至不可能)完成的方式遍历数据库。当与应用程序配合为数据库提供交互式用户接口时,HANDLER 接口是查看数据更天然的方式。   HANDLER 在某种程度上是一个有点底层的语句。例如,它不能提供一致性。也就是说,HANDLER ... OPEN 不会获取表的快照,也不会锁定表。这意味着在 HANDLER ... OPEN 语句执行时,能够修改表数据(由当前会话或其余会话修改),而且这些修改可能仅对 HANDLER ... NEXT 或者 HANDLER ... PREV 扫描部分可见。   打开的句柄能够被关闭并标记为从新打开,在这种状况下,句柄将失去其在表中的位置。当如下两种状况都成立时,就会发生这种状况:   ● 任何会话在句柄的表上执行 FLUSH TABLES 或 DDL 语句。   ● 打开句柄的会话执行使用表的非 HANDLER 语句。   对一个表执行 TRUNCATE TABLE 语句将关闭使用 HANDLER OPEN 为这个表打开的全部句柄。   若是用 HANDLER 语句打开的表使用 FLUSH TABLES tbl_name WITH READ LOCK 刷新,则句柄将隐式刷新并失去其位置。
相关文章
相关标签/搜索