返回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 = ?','');