MySQL Execution Plan--使用Query Rewrite
安装Query Rewrite Plugin
在MySQL的安装目录的share文件夹下,有两个文件用来安装和卸载Query Rewrite Plugin:
install_rewriter.sql: 安装脚本
uninstall_rewriter.sql: 卸载脚本
install_rewriter.sql文件中脚本为:
/* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License. This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA */ CREATE DATABASE IF NOT EXISTS query_rewrite; CREATE TABLE IF NOT EXISTS query_rewrite.rewrite_rules (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
pattern VARCHAR(10000) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
pattern_database VARCHAR(20) CHARACTER SET utf8 COLLATE utf8_bin,
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,
pattern_digest VARCHAR(32),
normalized_pattern VARCHAR(100)
) DEFAULT CHARSET = utf8 ENGINE = INNODB; INSTALL PLUGIN rewriter SONAME 'rewriter.so';
CREATE FUNCTION load_rewrite_rules RETURNS STRING
SONAME 'rewriter.so'; DELIMITER // CREATE PROCEDURE query_rewrite.flush_rewrite_rules()
BEGIN
DECLARE message_text VARCHAR(100);
COMMIT;
SELECT load_rewrite_rules() INTO message_text;
RESET QUERY CACHE;
IF NOT message_text IS NULL THEN
SIGNAL SQLSTATE '' SET MESSAGE_TEXT = message_text;
END IF;
END // DELIMITER ; RESET QUERY CACHE;
安装完成后,可以使用下面脚本查看功能是否启用:
SHOW GLOBAL VARIABLES LIKE 'rewriter_enabled'; +------------------+-------+
| Variable_name | Value |
+------------------+-------+
| rewriter_enabled | ON |
+------------------+-------+
演示Demo
1、插入重写规则
INSERT INTO query_rewrite.rewrite_rules
(pattern, replacement, pattern_database)
VALUES
(
"SELECT * FROM TB001 WHERE C1=?",
"SELECT *,'NEW' AS C11 FROM TB001 WHERE C1=?",
"demodb"
);
2、加载规则
## 加载重写规则
CALL query_rewrite.flush_rewrite_rules(); ## 查看当前重写规则
SELECT * FROM query_rewrite.rewrite_rules \G *************************** 1. row ***************************
id: 7
pattern: SELECT * FROM TB001 WHERE C1=?
pattern_database: demodb
replacement: SELECT *,'NEW' AS C11 FROM TB001 WHERE C1=?
enabled: YES
message: NULL
pattern_digest: cf177a9a728143a27502f890698316e5
normalized_pattern: select `*` from `demodb`.`tb001` where (`C1` = ?)
1 row in set (0.00 sec)
3、测试重写:
SELECT * FROM TB001
WHERE C1=2; +--------+------+-----+
| ID | C1 | C11 |
+--------+------+-----+
| AAA102 | 2 | NEW |
| AAA112 | 2 | NEW |
| AAA12 | 2 | NEW |
| AAA122 | 2 | NEW |
| AAA132 | 2 | NEW |
+--------+------+-----+ SELECT * FROM TB001
WHERE C1=2 LIMIT 1; +--------+------+
| ID | C1 |
+--------+------+
| AAA102 | 2 |
+--------+------+
可以发现SQL语句中的换行或空格对重写规则无影响,但不能在重写模板基础上增加其他内容如LIMIT 字句。
MySQL Execution Plan--使用Query Rewrite的更多相关文章
- Oracle SQL explain/execution Plan
From http://blog.csdn.net/wujiandao/article/details/6621073 1. Four ways to get execution plan(anyti ...
- Execution Plan 执行计划介绍
后面的练习中需要下载 Demo 数据库, 有很多不同的版本, 可以根据个人需要下载. 下载地址 -http://msftdbprodsamples.codeplex.com/ 1. 什么是执行计划 ...
- 搜索引擎Query Rewrite
中心词抽取项目总结 B2B国际站Query重写.ppt 达观数据搜索引擎的Query自动纠错技术和架构详解 Natural Language Processing Simrank++ Query re ...
- sql server 执行计划(execution plan)介绍
大纲:目的介绍sql server 中执行计划的大致使用,当遇到查询性能瓶颈时,可以发挥用处,而且带有比较详细的学习文档和计划,阅读者可以按照我计划进行,从而达到对执行计划一个比较系统的学习. 什么是 ...
- Mysql报Packet for query is too large (1040 > 1024)错误
Linux下mysql 报Packet for query is too large (1040 > 1024)错误的解决方法 项目之前一直正常运行,这几天突然一直提示查询出错,看了下日志发现提 ...
- 一次MySQL异常排查:Query execution was interrupted
异常日志: 查询被中断了,先是在Google上查,又是再百度上查,基本上都是说程序超时设置setQueryTimeout的问题,就是说查询时间超过了设置的最大查询时间,导致查询被中断.我也没办法断定是 ...
- web.py+mysql插入中文提示query = query.encode(charset) UnicodeEncodeError: 'latin-1' codec can't encode characters in position 86-100
对于中文编码的问题,总会出现各种各样恶心的错误,还不知道应该怎么解决,首先,你从最开头就应该关注编码问题,尽量保证所有的编码方式都是一致的 用python+web.py+mysql来写程序,首先要保证 ...
- 关于mysql的错误 - no query specified
Mysql----error:no query specified mysql下抛出错误:error:no query specified出现此错误是sql不合法原因:如:select * from ...
- mysql慢查询Slow Query Log和未使用索引(Not Using Indexes)查询配置和使用
mysql的“慢查询”指的是超过了允许的最大查询时间(long_query_time)的sql语句,而“未使用索引”查询顾名思义就是查询语句没有使用到索引的sql语句. 慢查询配置和使用 在msyql ...
随机推荐
- 【Mybatis】多个参数如何写xml和mapper
1:#{0},#{1} 不写parameterType 2:注解 @Param("id")String id 3:Map parameterType="hashma ...
- [LeetCode] 875. Koko Eating Bananas 科科吃香蕉
Koko loves to eat bananas. There are N piles of bananas, the i-th pile has piles[i] bananas. The g ...
- vue-lazyload 图片懒加载
vue-lazyload简单使用 github地址:https://github.com/hilongjw/vue-lazyload 1.安装插件 npm install vue-lazyload - ...
- 性感VSCODE在线刷LeetCode的题
安装Nodejs并勾选添加到PATH VSCODE安装插件LeetCode 注册LeetCode账号(注意CN国区和国际区账号不通用),重启VSCODE并点左边栏那个LeetCode图标sign in ...
- Linux查看进程和已知端口是否启动
如查看activeMQ的61616这个端口是否启动,以及直接查看activeMQ进程是否启动,可以通过如下命令进行查看 其中netstat命令必须知道端口,如果能查出就证明已启动,如果查出没有结果则表 ...
- python使用rdflib创建rdf,在jena fuseki上执行SPARQL查询
建立并启动jena fuseki服务 参考:https://www.cnblogs.com/bincoding/p/11223372.html 使用rdflib创建rdf文件 import rdfli ...
- SpringBoot+EventBus使用教程(一)
一.简介 EventBus是一个基于发布订阅的事件总线,在Java和Android里都可以使用. 二.使用 1.引入pom <dependency> <groupId>org. ...
- Beta冲刺(5/7)——2019.5.27
作业描述 课程 软件工程1916|W(福州大学) 团队名称 修!咻咻! 作业要求 项目Beta冲刺(团队) 团队目标 切实可行的计算机协会维修预约平台 开发工具 Eclipse 团队信息 队员学号 队 ...
- VUE方法
1.$event 变量 $event 变量用于访问原生DOM事件. <!DOCTYPE html> <html lang="zh"> <head> ...
- Java中转换为二进制的几种实现
public class HexUtil { private static final String[] DIGITS_UPPER = {"0", "1", & ...