Mysql应用MYSQL神秘的HANDLER命令与实现方法
《Mysql应用MYSQL神秘的HANDLER命令与实现方法》要点: MYSQL实例 MYSQL实例MySQL“自古以来”都有一个神秘的HANDLER命令,而此命令非SQL标准语法,可以降低优化器对于SQL语句的解析与优化开销,从而提升查询性能.看到这里,可能有小伙伴不淡定了,这么好的东西为啥没广泛使用呢?这不是与几年前很夯的handlersocket插件类似吗? MYSQL实例那么,我们先来看看Handler语法说明: MYSQL实例HANDLER tbl_name OPEN [ [AS] alias] MYSQL实例首先从语法上看,HANDLER可以通过指定的索引去访问数据.但此语法并不支持DML操作.此外,由于减少了SQL解析,Handler命令的性能真的非常不错,根据Inside君的简单主键测试,Handler命令比SQL要快40%~45%.测试脚本如下: MYSQL实例
SET @id=FLOOR(RAND()*1000000);
HANDLER sbtest.sbtest1 OPEN AS c;
HANDLER C READ `PRIMARY` = (@id);
HANDLER C CLOSE;
MYSQL实例在Inside君的24C的测试服务器上,64线程主键查询跑到了近37W QPS,还是非常令人印象深刻的.对比SQL的SELECT查询,整体测试结果如下图所示: MYSQL实例 MYSQL实例命令HANDLER的主要实现在源码sql_handler.h、sql_handler.cc,设个断点就能观察到具体的流程.MySQL上层及InnoDB存储引擎层主要实现函数入口为: Sql_cmd_handler_open::execute Sql_cmd_handler_read::execute Sql_cmd_handler_close::execute ha_innobase::init_table_handle_for_HANDLER ha_partition::init_table_handle_for_HANDLER()(7版本支持HANDLER操作分区表) MYSQL实例既然性能不错,为什么在生产环境中并不见到命令HANDLER的使用呢?主要是因为HANDLER命令存在以下几个主要问题: MYSQL实例非一致性读取??? MYSQL实例The handler interface does not have to provide a consistent look of the data (for example,dirty reads are permitted),so the storage engine can use optimizations that SELECT does not normally permit. MYSQL实例/* We let HANDLER always to do the reads as consistent reads,even MYSQL实例貌似用HANDLER命令来做主键的查询是不错的,减少了SQL解析器的开销,性能提升杠杠的.但为此,应用要付出巨大的改动,而SQL最大的优势就在于标准化.相信这也是目前NoSQL数据库遇到的最大的一个问题.比如MongoDB,Inside君每次写查询时都要打开官方的命令对照表…… (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- php – MySQL:如何在单个查询中查询多个“统计信息”?
- Mysql应用解决MySQL中的Slave延迟问题的基本教程
- Mysql必读利用SQL注入漏洞拖库的方法
- 我不应该在MySQL的字段名中使用 – (破折号)吗?
- mysql 的时间函数
- ERROR 1820 (HY000): You must reset your password using
- MySQL修改字段名、字段类型
- Mysql实例MySQL 5.6 中TIMESTAMP with implicit DEFAULT va
- Mysql应用MYSQL同步 Slave_IO_Running: No 或者Slave_SQL_R
- Mysql应用关于mysql init_connect的几个要点总结