备注:文章编写时间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 = ?','');
完毕!