備註:文章編寫時間201904-201905期間,後續官方在github的更新沒有被寫入mysql
多路複用[Multiplexing]git
多路複用既單一連接的複用;經過多路複用配置後,能夠大幅度下降後端節點的鏈接數。github
當事務在鏈接中處於活動狀態時,將禁用多路複用,直到事務提交或回滾爲止。sql
若是執行了 LOCK TABLE,LOCK TABLES或FLUSH TABLES WITH READ LOCK,則禁用多路複用,直到執行UNLOCK TABLES。後端
若是執行了GET_LOCK()函數,則禁用多路複用,而且永遠不會再次啓用。緩存
在query_digest(查詢概要)中具備@(引用變量)的全部查詢都將禁用多路複用,而且永遠不會再次啓用它。
注意:若是您正在select一個變量(例如,select @test_var)而且沒有按預期得到結果,則極可能是因爲查詢規則將您的語句路由到另外一個主機組(這時請查看您的查詢規則)。session
一樣,若是執行如下這些命令,也會發生一樣的狀況:
1)SET SQL_SAFE_UPDATES=?,SQL_SELECT_LIMIT=?,MAX_JOIN_SIZE=? (mysql --safe-updates)
2)SET FOREIGN_KEY_CHECKS
3)SET UNIQUE_CHECKS
4)SET AUTO_INCREMENT_INCREMENT (v 1.4.4+)
5)SET AUTO_INCREMENT_OFFSET (v 1.4.4+)
6)SET GROUP_CONCAT_MAX_LEN (v 1.4.4+)ide
但主要,在Proxy SQL中硬編碼有2個例外,它們不會禁用多路複用:
1)SELECT @@tx_isolation
2)SELECT @@version
以上這些例外語句是硬編碼的,由於許多應用程序在每一個鏈接中運行它們。函數
若是查詢包含MySQL的 SQL_CALC_FOUND_ROWS (SELECT語句中選項),則禁用多路複用,而且永遠不會再次啓用該鏈接。編碼
若是執行了 CREATE TEMPORARY TABLE 語句,則禁用多路複用,而且永遠不會再次在鏈接上啓用多路複用。
若是執行MySQL的 PREPARE 語句(使用TEXT協議而不是BINARY協議建立預準備語句),則禁用多路複用,而且永遠不會再次啓用。
若是SQL_LOG_BIN設置爲0,則禁用多路複用,直到SQL_LOG_BIN設置回1。
大多數會話變量不會被自動處理。
例如,若是客戶端發出 SET TX_ISOLATION=? ,則多路複用不會被禁用。
但若是您的客戶端使用了不一樣的tx_isolation,這樣的使用方式是有問題的;推薦將全部客戶端指定相同的tx_isolation,這也是默認的。(根據個人經驗,使用通一的隔離級別纔是大衆選擇)。
在 mysql_query_rules.multiplexing 中容許根據匹配條件來控制啓用或禁用多路複用。
該字段目前接受如下值:
0 : 禁用多路複用
1 : 啓用多路複用
2 : 對包含@變量的該特定查詢,不由用多路複用。
例如,在您的應用程序中使用 SET SQL_SELECT_LIMIT 提示語句,您能夠建立如下兩個規則:
INSERT INTO mysql_query_rules (active,match_digest,multiplex) VALUES ('1','^SET SQL_SELECT_LIMIT=?',0), (1,'^SET SQL_SELECT_LIMIT=DEFAULT,1);
若是您的應用程序發送了相似 SELECT @@ max_allowed_packet 的內容,而且您但願阻止所以而禁用多路複用,則能夠建立如下規則:
INSERT INTO mysql_query_rules (active,match_digest,multiplex) VALUES ('1','^SELECT @@max_allowed_packet',2);
......甚至能夠緩存它:
INSERT INTO mysql_query_rules (active,match_digest,multiplex,cache_ttl) VALUES ('1','^SELECT @@max_allowed_packet',2,60000);
若是您的應用程序正在嘗試設置一些將致使禁用多路複用的變量,而且您認爲能夠對其進行過濾,則能夠建立一個在不執行查詢的狀況下返回OK的過濾器:
INSERT INTO mysql_query_rules (active,match_digest,OK_msg) VALUES ('1','^SET @@wait_timeout = ?','');
完畢!