专栏名称: 高可用架构
高可用架构公众号。
目录
相关文章推荐
51好读  ›  专栏  ›  高可用架构

不用紧急上线,在线优化SQL?MySQL 5.7新特性Query Rewrite plugin使用

高可用架构  · 公众号  · 架构  · 2016-11-30 08:56

正文

请到「今天看啥」查看全文


+------------------+-------+


(如果没找到相的SQL,请确认一下MySQL的版本是不是支持)

如果为了长期使用,建议写到配置文件:

[mysqld]

rewriter_enabled=ON


说明: 如果想禁用该特性,只需要使用相应的$basedir/share/uninstall_rewriter.sql


来一个简单的练习,测试一下:


use rewrite_rules;

insert into rewrite_rules(pattern, replacement) values('select ?' , 'select ?+1');

call flush_rewrite_rules();




特别提示: 被SQL改写的SQL在测试时,可以利用show warnings; 来确定一下改写成什么样子

再来看一下:




两个警告, 一个是类型不对,内部去除,另一个进行转换+1




这里看到关建词,并没有进行转换。 所以大家对于转换也要小词,对于关词键,类型不匹配的也要小心处理。 免的出现不是预期的结果。

简单说一下,存储改写规则的表, 也让我们后面能更好的使用及排查问题:




id:  无业务意义,就是自增(一个良好的习惯)

pattern :  对应的需要改写的源SQL,规一化后的样子(把参数,用问题替换)

pattern_database:  指写需要改写的DB名称(如果SQL中有From关键词,且SQL中没有DB名,该参数是必须的)

replacement:  指定改写后的样子

enabled:  是不是启用

message:  改写启用,如果规则不生效,错误原因在这里,该字段一段应该是空的。

pattern_digest : 用于Debug使用 ,一般可以不看

normallized_pattern:  用于Debug使用,一般可以不看



开始 Case,从 Case 中学习


分成以下几个案例:


去除类型转换

改字段名后兼容报错

利用 SQL改写优化(join例子)

添加 SQL执行超时


首先看第一个案例:

表结构:




查询:




看到有什么问题了吗? (表里只有11行数据,所有都查出来),而且更不靠谱的是连一个警告都没有。

有经验的DBA一看就知道是数据类型的问题,处理上也非常发方便,在SQL上加一个引号就可以了。 如果这个是线上发现, 立刻让开发去改,特别是那种编译性语言,也不会太快。 那么先来看看Query rewrite 来一个首秀:








请到「今天看啥」查看全文