DBA主宰一切请求,MySQL 查询重写
这个功能一年左右之前就以知晓,应该是5.7的高版本中。今天难得有兴致测试、随之也就总结一下。
安装
- 首先创建一个query_rewrite库, 库中一个rewrite_rules表。用来保存定义的改写规则。
- 安装rewriter插件,实现函数。
- 创建一个函数load_rewrite_rules的自定义函数,其实现为rewriter共享库。
- 创建一个存储过程,存储过程里面定义刷新查询改写缓存的方法。
- 从查询缓存集中移除所有查询缓存。(8.0移除了QueryCache,自然也就没有这个。)
mysql -udba_yix -p < /usr/local/mysql/share/install_rewriter.sql

mysql -udba_yix -p < /usr/local/mysql/share/uninstall_rewriter.sql

INSERT INTO query_rewrite.rewrite_rules (pattern, replacement)
VALUES('SELECT ?', 'SELECT ? + 1');
CALL query_rewrite.flush_rewrite_rules();


INSERT INTO query_rewrite.rewrite_rules (pattern, replacement)
VALUES('DELETE FROM db1.t1 WHERE col = ?',
'UPDATE db1.t1 SET col = NULL WHERE col = ?');
CALL query_rewrite.flush_rewrite_rules();

发现报了错。如果有报错,需要结合 query_rewrite.rewrite_rules表中的message字段查看原因。

这就是我们上面提到的在8.0.12之前只能改写select。
UPDATE query_rewrite.rewrite_rules SET enabled = 'NO' WHERE id = ;
CALL query_rewrite.flush_rewrite_rules();
重启则参考下面语句。
UPDATE query_rewrite.rewrite_rules SET enabled = 'YES' WHERE id = ;
CALL query_rewrite.flush_rewrite_rules();
INSERT INTO query_rewrite.rewrite_rules
(pattern, replacement) VALUES(
'SELECT * FROM appdb.users WHERE id = ?',
'SELECT * FROM appdb.users WHERE user_id = ?'
);
INSERT INTO query_rewrite.rewrite_rules
(pattern, replacement, pattern_database) VALUES(
'SELECT * FROM users WHERE id = ?',
'SELECT * FROM users WHERE user_id = ?',
'appdb'
);
CALL query_rewrite.flush_rewrite_rules();
SELECT * FROM users WHERE appdb.id = id_value;
SELECT * FROM users WHERE id = id_value;
则重写器(rewriter)会使用第一条规则匹配第一条SQL。第二条规则匹配第二条SQL(前提是默认的数据库是appdb)。
SELECT ?,
|
Prepared Statement
|
Whether Pattern Matches Statement
|
|
PREPARE s AS 'SELECT 3, 3'
|
Yes
|
|
PREPARE s AS 'SELECT ?, 3'
|
Yes
|
|
PREPARE s AS 'SELECT 3, ?'
|
No
|
|
PREPARE s AS 'SELECT ?, ?'
|
No
|
重写器状态统计信息
mysql> SHOW GLOBAL STATUS LIKE 'Rewriter%';
+-----------------------------------+-------+
| Variable_name | Value |
+-----------------------------------+-------+
| Rewriter_number_loaded_rules | |
| Rewriter_number_reloads | |
| Rewriter_number_rewritten_queries | |
| Rewriter_reload_error | ON |
+-----------------------------------+-------+
DBA主宰一切请求,MySQL 查询重写的更多相关文章
- MySQL中间件之ProxySQL_读写分离/查询重写配置
MySQL中间件之ProxySQL_读写分离/查询重写配置 Posted on 2016-12-25 by mark blue, mark Leave a comment MySQL 1.闲扯几句 读 ...
- MySQL 子查询(四)子查询的优化、将子查询重写为连接
MySQL 5.7 ref ——13.2.10.10优化子查询 十.子查询的优化 开发正在进行中,因此从长远来看,没有什么优化建议是可靠的.以下列表提供了一些您可能想要使用的有趣技巧.See also ...
- mysql查询性能优化
mysql查询过程: 客户端发送查询请求. 服务器检查查询缓存,如果命中缓存,则返回结果,否则,继续执行. 服务器进行sql解析,预处理,再由优化器生成执行计划. Mysql调用存储引擎API执行优化 ...
- MySQL查询性能优化(精)
MySQL查询性能优化 MySQL查询性能的优化涉及多个方面,其中包括库表结构.建立合理的索引.设计合理的查询.库表结构包括如何设计表之间的关联.表字段的数据类型等.这需要依据具体的场景进行设计.如下 ...
- 170727、MySQL查询性能优化
MySQL查询性能优化 MySQL查询性能的优化涉及多个方面,其中包括库表结构.建立合理的索引.设计合理的查询.库表结构包括如何设计表之间的关联.表字段的数据类型等.这需要依据具体的场景进行设计.如下 ...
- 生产要不要开启MySQL查询缓存
一.前言 在当今的各种系统中,缓存是对系统性能优化的重要手段.MySQL Query Cache(MySQL查询缓存)在MySQL Server中是默认打开的,但是网上各种资料以及有经验的DBA都建议 ...
- [转]向facebook学习,通过协程实现mysql查询的异步化
FROM : 通过协程实现mysql查询的异步化 前言 最近学习了赵海平的演讲,了解到facebook的mysql查询可以进行异步化,从而提高性能.由于facebook实现的比较早,他们不得不对php ...
- mysql查询中通配符的使用
mysql查询中通配符的使用 在mysql查询中经常会使用通配符,并且mysql的通配符和pgsql的存在区别(稍候再讨论),而且mysql中还可以使用正则表达式. SQL模式匹配: “_” ...
- mysql查询更新时的锁表机制分析
为了给高并发情况下的mysql进行更好的优化,有必要了解一下mysql查询更新时的锁表机制. 一.概述 MySQL有三种锁的级别:页级.表级.行级.MyISAM和MEMORY存储引擎采用的是表级锁(t ...
随机推荐
- GoldenGate过程 abend,报错OGG-00868 ORA-02396: Exceeded Maximum Idle Time, Please Connect Again
GoldenGate过程 abend,报错OGG-00868 ORA-02396: Exceeded Maximum Idle Time, Please Connect Again 参考原始: Gol ...
- PHP模拟POST提交数据并获得返回值之CURL方法(使用PHP extension,然后使用php_curl.dll,很不错)
今天公司做个东西,需要条用同事的接口,我的代码和他的代码不在同一个域下,但是都是子域. a.ifensi.com与b.ifensi.com的关系. 我需要传递一个关联数组过去,他那边给我返回一个jso ...
- mysql主从配置及其读写分离
mysql主从配置意思就是一个主mysql服务器,一个从mysql服务器,一共要用到两台服务器.主服务器新增一个账号专门让从服务器来访问同步工作,主从配置完成后,主服务器主要就是新增和update操作 ...
- Win8Metro(C#)数字图像处理--2.7图像伪彩色
原文:Win8Metro(C#)数字图像处理--2.7图像伪彩色 2.7图像伪彩色函数 [函数名称] 图像伪彩色函数PseudoColorProcess(WriteableBitmap src) ...
- GIS基础软件及操作(八)
原文 GIS基础软件及操作(八) 练习八.地理建模 地理建模:Model Builder 土壤侵蚀危险性建模分析 认识ModelBuilder操作界面 1: 添加硬盘上的数据或工具到模型中,数据也可以 ...
- Substring详解
class Program { static void Main(string[] args) { string str = "Hello World!"; ; //Substri ...
- TIFF图片简介
每个TIFF文件都是从指示字节顺序的两个字节开始的.“II”表示小字节在先.“MM”表示大字节在先字节顺序.后面的两个字节表示数字42.数字42是“为了其深刻的哲学意义"而选择的. 42的读 ...
- Android多线程(一)
在Android应用的开发过程中,我们不可避免的要使用多线程,获取服务器数据.下载网络数据.遍历文件目录查找特定文件等等耗时的工作都离不开线程的知识.Android继承了Java的多线程体系,同时又实 ...
- C#WebBroswer控件的使用
在WebBroswer中可以嵌入一个网页文件,通过Url属性绑定. URI,统一资源标识符,用来唯一的标识一个资源. URL,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源. 它包 ...
- Editor.md v1.4.2 发布,改进自定义工具栏
分享 <关于我> 分享 [中文纪录片]互联网时代 http://pan.baidu.com/s/1qWkJfcS 分享 <HTML开发MacOSAp ...