MYSQL資料庫的query rewrite,關鍵時刻能拯救你的業務

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

MYSQL資料庫的query rewrite,關鍵時刻能拯救你的業務

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;

MYSQL資料庫的query rewrite,關鍵時刻能拯救你的業務