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)

参考

https://dev.mysql.com/doc/refman/5.7/en/rewriter-query-rewrite-plugin.html

你可能感兴趣的:(MySQL query_rewrite功能)