返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.htmlhtml
multiplexing,做用是將語句分多路路由。開啓了multiplexing開關,讀/寫分離、按規則路由才能進行。但有時候,有些語句要求路由到同一個主機組,甚至是同一個主機組中的同一個節點上。這時會自動禁用multiplexing。禁用multiplexing後,語句會根據同一個鏈接進行路由。mysql
也就是說,在禁用multiplexing狀況下,會將語句路由到同一個主機組中的同一個節點上。sql
當某鏈接中激活了一個事務,則在該事務提交或回滾以前,multiplexing將一直被禁用。緩存
當執行了LOCK TABLE
, LOCK TABLES
或 FLUSH TABLES WITH READ LOCK
時,將一直禁用multiplexing,直到執行UNLOCK TABLES
。session
GET_LOCK()
時若是執行了GET_LOCK()
,將一直禁用multiplexing,且永再也不次啓用。編碼
全部查詢的query_digest
部分包含了@
的都將禁用multiplexing,且永再也不次啓用。code
下面的命令是相似的狀況,都會禁用multiplexing且再也不次啓用:htm
SET SQL_SAFE_UPDATES=?,SQL_SELECT_LIMIT=?,MAX_JOIN_SIZE=?
(mysql --safe-updates
)SET FOREIGN_KEY_CHECKS
SET UNIQUE_CHECKS
SET AUTO_INCREMENT_INCREMENT
(v 1.4.4+)SET AUTO_INCREMENT_OFFSET
(v 1.4.4+)SET GROUP_CONCAT_MAX_LEN
(v 1.4.4+)但下面兩個語句是例外,由於它們被硬編碼爲不由用multiplexing:blog
SELECT @@tx_isolation
SELECT @@version
之因此要硬編碼這兩個例外,是由於不少應用程序在每一個鏈接中都會執行這兩個語句。事務
SQL_CALC_FOUND_ROWS
若是查詢語句中包含了SQL_CALC_FOUND_ROWS
,那麼該鏈接上將禁用multiplexing且再也不啓用。
若是執行了CREATE TEMPORARY TABLE
,那麼該鏈接上將禁用multiplexing且再也不啓用。
PREPARE
若是執行PREPARE
語句(該語句使用文本協議準備好語句,而不是二進制協議),將禁用multiplexing且再也不啓用。
SQL_LOG_BIN
設置爲0時,即禁用binlog若是SQL_LOG_BIN
設置爲0,則multiplexing將被禁用直到SQL_LOG_BIN
開啓。
大多數會話變量都不會自動進行處理。
例如,若是客戶端發出了SET TX_ISOLATION=?
,將不會禁用multiplexing。
當有不一樣客戶端使用了不一樣的tx_isolation
時,這將是一個bug,但通常全部客戶端都使用默認的tx_isolation
(絕大多數狀況都如此)。
mysql_query_rules.multiplexing
容許基於匹配標準來啓用/禁用multiplexing。當前該字段可接受的值有:
@
的查詢語句不由用multiplexing(默認包含了@
的語句會禁用multiplexing)例如,若是你的應用程序中使用了SET SQL_SELECT_LIMIT
,你能夠建立下面兩條規則來啓用multiplexing:
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
的語句,爲了不默認狀況下這樣的語句禁用multiplexing,能夠建立以下規則:
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);
若是你的應用程序嘗試要設置一個變量,而這可能會禁用multiplexing,若是這個設置語句可以寫規則來匹配,能夠建立一個篩選條件返回OK而無需去執行查詢,這樣就不會修改multiplexing當前的策略:
INSERT INTO mysql_query_rules (active,match_digest,OK_msg) VALUES ('1','^SET @@wait_timeout = ?','');