MySQL 中的查询重写插件是一个组件,允许您在执行之前修改传入的 SQL 查询。它提供了根据特定需求转换、路由、过滤或扩展查询的功能。
如果您已安装了该插件,可以使用以下 SQL 语句来定义您的 SQL 替换规则和错误消息处理.
INSERT INTO query_rewrite.rewrite_rules (message, pattern, replacement)
VALUES(Unique_ID, Original_SQL, Rewrite_SQL);
MySQL 中的 query_rewrite.rewrite_rules 表存储了 Query Rewriter 插件用于重写 SQL 查询的规则。该表包含两列:
Pattern – 此列代表触发 SQL 查询重写的模式或条件。它定义了要匹配的特定查询或查询模式。
Replacement – 此列指定应该应用于匹配的查询或查询模式的替换或转换。
当执行 SQL 查询时,Query Rewriter 插件会检查 query_rewrite.rewrite_rules 表以查找匹配的模式。如果模式与执行的查询匹配,插件将使用相应的替换重写查询。这使您能够根据特定的模式或条件修改查询结构、优化查询或添加自定义逻辑。
以下是一个包含硬编码字面量的 SQL 语句示例,执行该 SQL 需要 2.1 秒,并附有以下查询计划。
SELECT *
FROM employee
WHERE emp_id in (SELECT emp_id id
FROM emp_subsidiary
where emp_dept < ‘D’)
ORDER BY emp_id LIMIT 1;
以下屏幕显示了通过 Tosska DB Ace SQL 调优工具识别出的性能显著提升的替代 SQL 语句。由于注入 JOIN ORDER 提示,此优化后的 SQL 查询比原始 SQL 快了300多倍.
现在,我们需要将这个优化后的 SQL 与原始 SQL 一起部署到数据库中。然而,一个挑战出现在条件“emp_dept < 'D'”上,当使用一个带有不同硬编码字面量的 SQL 语句,比如“emp_dept < 'E'”时,它与 SQL 文本不匹配。因此,我们必须使用数值占位符Placeholder来替换硬编码字面量,将其替换为占位符“?”,如下所示。
INSERT INTO query_rewrite.rewrite_rules (message, pattern, replacement)
VALUES(Unique_ID, Original_SQL, Rewrite_SQL);
Original_SQL
SELECT *
FROM employee
WHERE emp_id in (SELECT emp_id id
FROM emp_subsidiary
where emp_dept < ?)
ORDER BY emp_id LIMIT 1
Rewrite_SQL
select /*+ QB_NAME(QB1) JOIN_ORDER(`employee`@QB1, `emp_subsidiary`@QB2) */ *
from employee
where emp_id in (select /*+ QB_NAME(QB2) */ emp_id id
from emp_subsidiary
where emp_dept < ?)
order by emp_id limit 1
Tosska DB Ace for MySQL通过自动化发现优化SQL替代方案和部署具有数值占位符替换的SQL,简化了这一过程。
查询重写插件功能强大且易于使用。最具挑战性的方面是为性能较差的SQL语句找到替代SQL。Tosska DB Ace Enterprise for MySQL可以帮助您自动化这一过程,从识别性能较差的SQL语句到重写SQL语法并部署替代规则。
Tosska DB Ace Enterprise for MySQL – Tosska Technologies Limited