MySQL 服務(wù)端支持重寫語句功能。你可以認(rèn)為這類似用正則表達(dá)式去匹配特定的語句并重寫。
這個(gè)功能的設(shè)計(jì)目標(biāo)之一是讓 DBA 們能夠在語句中插入查詢提示。這緩和了應(yīng)用自身無法修改語句的情形,例如用到了 ORM 框架,或應(yīng)用是私有的。
需要指出的是,說查詢重寫類似于正則表達(dá)式,其實(shí)比正則高效得多。當(dāng)語句被分析時(shí),預(yù)編譯語句會(huì)與內(nèi)部的需要重寫的語句哈希表對(duì)照檢查。如果一個(gè)語句需要重寫,服務(wù)端會(huì)重復(fù)這一步驟并重新解析該查詢。這意味著不需要重寫的語句的處理代價(jià)很低,并且需要重寫的語句需要解析兩次。
例子33:服務(wù)端通過重寫,改變了查詢
# 在命令行中,安裝查詢重寫插件
mysql -u root -p < install_rewriter.sql
-- 在 MySQL 中添加重寫規(guī)則并應(yīng)用
INSERT INTO query_rewrite.rewrite_rules(pattern_database, pattern, replacement) VALUES (
"world",
"SELECT * FROM Country WHERE population > ? AND continent=?",
"SELECT * FROM Country WHERE population > ? AND continent=? LIMIT 1"
);
CALL query_rewrite.flush_rewrite_rules();
-- 每次當(dāng)重寫事件發(fā)生時(shí),會(huì)觸發(fā)警告信息
SELECT * FROM Country WHERE population > 5000000 AND continent='Asia';
-- 從警告信息可以看到重寫結(jié)果
SHOW WARNINGS;
Query 'SELECT * FROM Country WHERE population > 5000000 AND continent='Asia''
rewritten to 'SELECT * FROM Country WHERE population > 5000000 AND continent='Asia' LIMIT 1' by a query rewrite plugin
-- 查詢重寫規(guī)則
SELECT * FROM query_rewrite.rewrite_rules
*************************** 1. row ***************************
id: 2
pattern: SELECT * FROM Country WHERE population > ? AND continent=?
pattern_database: world
replacement: SELECT * FROM Country WHERE population > ? AND continent=? LIMIT 1
enabled: YES
message: NULL
pattern_digest: 88876bbb502cef6efddcc661cce77deb
normalized_pattern: select `*` from `world`.`Country` where ((`population` > ?) and (`continent` = ?))
提示
MySQL 服務(wù)端支持查詢重寫插件。這里展示的例子是一個(gè)后置解析重寫插件(Rewriter),某些查詢可能需要一個(gè)前置解析插件。更多信息可以在 MySQL 官方手冊(cè)中找到:
https://dev.mysql.com/doc/refman/5.7/en/rewriter-query-rewrite-plugin.html
譯自:
Query Rewrite - The Unofficial MySQL 8.0 Optimizer Guide