美文网首页
Mysql HANDLER语句

Mysql HANDLER语句

作者: judeshawn | 来源:发表于2019-08-06 16:26 被阅读0次
    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语句

          本文链接:https://www.haomeiwen.com/subject/helidctx.html