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
HANDLE语句提供了直接访问存储引擎的接口。对于innodb和myism表都是可用的。
HANDLER ... OPEN
语句会打开一个表,使其能够用后续的HANDLER ... READ
语句访问。这个表不能和其他会话共享直到HANDLER ... CLOSE
或会话关闭。
如果使用别名打开表,后续在使用HANDLER语句打开表必须使用别名而不能用原表名。如果不使用别名,而是使用带有数据库名前缀的表名,后续引用需要去掉数据库名。例如,使用mydb.mytable,后续引用需使用mytable。
第一个HANDER ... 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
):
HANDLER tbl_name READ `PRIMARY` ...
第二个HANDLER ... READ
语法表示按照索引的某种顺序来按照where条件筛选结果行
第三个HANDLER ... READ
语法表示按照表中行的自然顺序匹配where条件。当需要全表扫描来获取每一行时(结果行足够多),比第一、二种使用索引方式都要更快。实际上,自然行顺序就是数据行在MyISAM表数据文件中的存放顺序。这条语句对于InnoDB表同样适用,但是不存在这样的概念,因为没有独立的数据文件。
若没有LIMIT子句,所有HANDLER ... READ
形式的语句都最多只会获取一行。要返回多少行,就LIMIT多少。
HANDLER ... CLOSE
用于关闭用HANDLER ... OPEN
打开的表。
为什么使用HANDLER接口?
- HANDLER更快
-
HANDLER ... OPEN
可以分配特定存储引擎的句柄对象。这个句柄对象可以被后续HANDLER(关闭之前的)语句重用;不需要每次都初始化。 - 语句解析更少
- 不需要优化器或查询检查等额外消耗
- handler接口不必提供数据的一致性查看(例如,允许脏读),因此存储引擎是可以实现select语句正常情况下不允许使用的执行计划。
-
- HANDLER使得使用低层类ISAM接口的应用可以很轻松地和Mysql对接。
- HANDLER让你可以以一种对于select语句很难(甚至不可能)的方式来详细研究数据库。HANDLER接口是一种更自然的方式来查看数据
HANDLER从某种意义上讲是一种更低层的语言。例如,它不提供一致性。也就是说,HANDLER ... OPEN
语句不会使用表的快照,并且不会锁表。这意味着HANDLER ... OPEN
语句执行之后,表数据可以被修改(当前会话或其他会话)并且这些修改中的一部分可能被HANDLER ... NEXT
或者HANDLER ... PREV
扫描。
一个打开的handler可以被关闭然后重新打开,这种情况下handler会丢失表中的位置。下面的两个场景中都会发生这样的情况:
- 任何会话执行了
FLUSH TABLES
(经验证,只有当前会话可以FLUSH TABLES
)或者对handler打开的表执行了DDL语句 - 会话在handler在打开的时候执行了使用该表的non-handler语句
TRUNCATE TABLE
会关闭用HANDER OPEN
打开的表上所有handlers。
如果一张用HANDLER打开的表被FLUSH TABLES tbl_name WITH READ LOCK
flushed,handler会被隐式flushed并且丢失位置
网友评论