正文
+------------------+-------+
(如果没找到相的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 来一个首秀: