mysql query rewrite_MySQL query_rewrite插件

query_rewrite 插件功能MySQL 5.7 版本新特性

作用是把输入的一种语句改写成另外一种模式

优势是业务无法及时调整情况下通过MySQL将接收到的语句改写,如强制使用索引、子查询优化等

安装插件支持社区版

官方自带脚本安装

# 安装脚本位于MySQL的share目录,脚本集成了安装插件,建相应库表操作

mysql -S /tmp/mysql_sandbox5725.sock -uroot -proot < /opt/sandboxes/base/5.7.25/share/install_rewriter.sql

# 对应卸载使用脚本uninstall_rewriter.sql安装完成将自动创建query_rewrite库rewrite_rules表

show create table query_rewrite.rewrite_rules\G

CREATE TABLE `rewrite_rules` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`pattern` varchar(10000) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,

`pattern_database` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,

`replacement` varchar(10000) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,

`enabled` enum('YES','NO') CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT 'YES',

`message` varchar(1000) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,

`pattern_digest` varchar(32) DEFAULT NULL,

`normalized_pattern` varchar(100) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

字段|解释 --|-- id |规则id ,此列是表的主键。 pattern|需要改写的源SQL pattern_database|需要改写的DB名称 replacement|指定改写后的样子 enabled|改写是否启用

插件使用

启用与关闭rewriter_enabled参数可全局关闭/开启 query_rewrite功能

改写语句

# 直接插入要改写的语句、改写后的以及对应业务库即可

INSERT INTO query_rewrite.rewrite_rules

(pattern, replacement, pattern_database) VALUES(

'SELECT * FROM users WHERE id = ?',

'SELECT * FROM users WHERE user_id = ?',

'appdb'

);

或或写库,表前加属主

INSERT INTO query_rewrite.rewrite_rules

(pattern, replacement) VALUES(

'SELECT * FROM appdb.users WHERE id = ?',

'SELECT * FROM appdb.users WHERE user_id = ?'

);

# 调用存储过程是让插入的新规则生效

CALL query_rewrite.flush_rewrite_rules();

举例说明

# 希望select不加where条件的语句默认都带上 limit 1的效果

mysql> select * from t_user;

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

| id | name | age |

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

| 1 | Michael | 18 |

| 2 | Jane | 20 |

| 3 | Lucy | 17 |

| 4 | Antony | 35 |

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

# 插入改写规则

INSERT INTO query_rewrite.rewrite_rules

(pattern, replacement, pattern_database) VALUES(

'SELECT * FROM t_user',

'SELECT * FROM t_user limit 1',

'test'

);

# 调用存储过程使规则生效

CALL query_rewrite.flush_rewrite_rules();

# 效果

mysql> select * from t_user;

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

| id | name | age |

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

| 1 | Michael | 18 |

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

1 row in set, 1 warning (0.00 sec)

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值