MYSQL資料庫的query rewrite,關鍵時刻能拯救你的業務
作為一個數據庫運維人員,總會碰到資料庫伺服器IO和CPU使用率飆升,緊接著,一線運維反饋說業務響應時間變長,甚至超時,於是開始看日誌,排查業務響應變長原因,最後發現是最近新上的應用中,有慢sql在查詢,將慢sql拿出來一看
這裡只是舉個例子,但現實中確實有寫成這樣的upper(pad)
select * from t_sbtest1 whereupper(pad)=‘00017586372-12420464424-97486344992-91872206880-55622626800’;
這是那個XX開發寫的,sql語句寫成這樣,簡直服了,服氣歸服氣,可是線上的問題必須要解決,等開發去修改程式碼,然後測試上線,黃花菜都涼了。
有沒有辦法解決這個難題呢,在mysql中有一個query rewrite元件可以臨時解決這個問題,下面就來看看查詢重寫元件是怎麼使用的,以及解決這個慢查詢的
1。query_rewrite元件安裝
cd到mysql安裝目錄的share目錄,找到install_rewriter。sql檔案
mysql> source /data/mysql-5。7。26/share/install_rewriter。sql
mysql> use query_rewrite
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+————————————-+
| Tables_in_query_rewrite |
| rewrite_rules |
1 row inset (0。02 sec)
mysql> SHOW GLOBAL VARIABLES LIKE ‘rewriter_enabled’;
+——————————+————-+
| Variable_name | Value |
| rewriter_enabled | ON |
1 row inset (0。01 sec)
2。Rewrite 支援的型別
MySQL 5。7 的 Query Rewrite Plugin 只支援 SELECT ,在 8。0 裡面會支援 INSERT , UPDATE , DELETE
3。新增規則,並將規則重新整理到記憶體
insertintoquery_rewrite。rewrite_rules(pattern,replacement,pattern_database)values(‘select*fromt_sbtest1whereupper(pad)=?’,‘select*fromt_sbtest1wherepad=?’,‘testdb’);
CALLquery_rewrite。flush_rewrite_rules();
mysql>select*fromt_sbtest1whereupper(pad)=‘00017586372-12420464424-97486344992-91872206880-55622626800’;
1rowinset,1warning(0。00sec)
mysql>showwarnings\G;
***************************1。row***************************
Level: Note
Code: 1105
Message:Query‘select * from t_sbtest1 where upper(pad)=’00017586372-12420464424-97486344992-91872206880-55622626800‘’rewrittento‘select * from t_sbtest1 where pad=’00017586372-12420464424-97486344992-91872206880-55622626800‘’byaqueryrewriteplugin
1rowinset(0。00sec)
在這裡可以看到select * from t_sbtest1 where upper(pad)=‘00017586372-12420464424-97486344992-91872206880-55622626800’‘,這個sql語句已經被重寫成select * from t_sbtest1 where pad=’00017586372-12420464424-97486344992-91872206880-55622626800‘,到這裡線上的慢sql語句已經解決了,但是query rewrite功能不能解決所有的慢查詢,例如like ‘%kkk%’就不能轉換成like ’kkk%‘,所以平時還是得給開發人員多培訓一下,怎麼去寫高效能sql的方法和技巧。
4。禁用某個 rule
UPDATE query_rewrite。rewrite_rules SET enabled = ’NO‘WHEREid = 7;
5。啟用某個 rule
UPDATE query_rewrite。rewrite_rules SET enabled = ’YES‘WHEREid = 7;