366
京東網上商城
【新特性】MySQL5.7新特性query_rewrite 插件
一。使用場景
在業務繁忙並且緊急上線,對就是那種特別繁忙,又不能停的那種。在係統不忙的時候 明明跑的很好。**但是**一旦業務繁忙,造成業務阻塞。當查看MySQL的滿查詢日誌中發現大量慢查詢日誌,(不是單單加索引就能搞定的哦)。這時候怎麼辦,難道怒對開發一頓,這時候你需要MySQL5.7新特性query_rewrite _Plugin插件了。
二。安裝配置插件
2.1安裝
[root@localhost share]# /usr/local/mysql/bin/mysql -u root -p < install_rewriter.sql
Enter password:
[root@localhost share]# pwd
/usr/local/mysql/share
驗證
"root@localhost:mysql.sock [(none)]>show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| query_rewrite |
| sys |
+--------------------+
安裝完成了 似不似很簡單呢~QAQ~
2.2配置一發
"root@localhost:mysql.sock [(none)]>use query_rewrite;
Database changed
"root@localhost:mysql.sock [query_rewrite]>show tables;
+-------------------------+
| Tables_in_query_rewrite |
+-------------------------+
| rewrite_rules |
+-------------------------+
查看rewrite_rules表,表結構大概是這樣的
CREATE TABLE `rewrite_rules` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`pattern` varchar(10000) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
`pattern_database` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
`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 DEFAULT NULL,
`pattern_digest` varchar(32) DEFAULT NULL,
`normalized_pattern` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
id :規則id ,此列是表的主鍵。
pattern:需要改寫的源SQL
pattern_database:需要改寫的DB名稱
replacement:指定改寫後的樣子
enabled:是否啟用
2.3舉個栗子
CREATE TABLE `aa` (
`id` int(11) DEFAULT NULL,
`name` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
"root@localhost:mysql.sock [aa]>insert into aa values (1,'a');
"root@localhost:mysql.sock [aa]>insert into aa values (2,'a');
在query_rewrite中修改規則
"root@localhost:mysql.sock [aa]>insert into query_rewrite.rewrite_rules(pattern, replacement, pattern_database) values (
-> "select * from aa ","select * from aa where id=1", "aa");
"root@localhost:mysql.sock [aa]>call query_rewrite.flush_rewrite_rules(); #加載一下
驗證
root@localhost:mysql.sock [aa]>select * from aa;
+------+------+
| id | name |
+------+------+
| 1 | a |
+------+------+
是不是感覺很神奇呢,對於那種SQL隱式轉換啦,強製走個索引啦 子查詢的優化啦 等等等等 。尤其是係統繁忙來不及修改程序 來不及修改SQL的時候。真的能夠救你的係統一命哦。如果你想讓某個SQL變慢哦,讓某個程序員背鍋也是可以的哦。。
三.總結
建議多關注一下MySQL的新特性。不知不覺就能使用到,有效提升和改善業務環境。
最後更新:2017-09-14 21:32:45