码迷,mamicode.com
首页 > 数据库 > 详细

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

时间:2020-12-10 10:32:49      阅读:4      评论:0      收藏:0      [点我收藏+]

标签:解析   查看   ima   ble   innodb   原因   doc   就是   close   

HANDLER 语句

1. HANDLER tbl_name OPEN [ [AS] alias]
2. 
3. HANDLER tbl_name READ index_name { = | <= | >= | < | > } (value1,value2,...)
4.     [ WHERE where_condition ] [LIMIT ... ]
5. HANDLER tbl_name READ index_name { FIRST | NEXT | PREV | LAST }
6.     [ WHERE where_condition ] [LIMIT ... ]
7. HANDLER tbl_name READ { FIRST | NEXT }
8.     [ WHERE where_condition ] [LIMIT ... ]
9. 
10. HANDLER tbl_name CLOSE  

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 语句可以为索引中的所有三列或最左边前缀中的列指定值。例如:

1. HANDLER ... READ my_idx = (col_a_val,col_b_val,col_c_val) ...
2. HANDLER ... READ my_idx = (col_a_val,col_b_val) ...
3. HANDLER ... READ my_idx = (col_a_val) ...

要使用 HANDLER 接口引用表的 PRIMARY KEY,请使用带引号的标识符“PRIMARY”:

1. 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 刷新,则句柄将隐式刷新并失去其位置。

官方网址:
https://dev.mysql.com/doc/refman/8.0/en/handler.html

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

标签:解析   查看   ima   ble   innodb   原因   doc   就是   close   

原文地址:https://blog.51cto.com/15023289/2559944

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!