Mysql 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

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 LOCKflushed,handler会被隐式flushed并且丢失位置

你可能感兴趣的:(Mysql HANDLER语句)