文章转载自:https://www.cnblogs.com/f-ck-need-u/p/9372447.html

multiplexing

multiplexing,作用是将语句分多路路由。开启了multiplexing开关,读/写分离、按规则路由才能进行。但有时候,有些语句要求路由到同一个主机组,甚至是同一个主机组中的同一个节点上。这时会自动禁用multiplexing。禁用multiplexing后,语句会根据同一个连接进行路由。

也就是说,在禁用multiplexing情况下,会将语句路由到同一个主机组中的同一个节点上。

什么情况下会禁用多路路由(disable multiplexing)?

  • 激活事务时

当某连接中激活了一个事务,则在该事务提交或回滚之前,multiplexing将一直被禁用。

  • 表被锁

当执行了LOCK TABLE, LOCK TABLES 或 FLUSH TABLES WITH READ LOCK 时,将一直禁用multiplexing,直到执行UNLOCK TABLES。

  • 使用GET_LOCK()时

如果执行了GET_LOCK(),将一直禁用multiplexing,且永不再次启用。

  • 使用某些特定的会话/用户(session/user)变量

所有查询的query_digest部分包含了@的都将禁用multiplexing,且永不再次启用。

下面的命令是类似的情况,都会禁用multiplexing且不再次启用:

- 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:

- 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开启。

Not handled session variables

大多数会话变量都不会自动进行处理。

例如,如果客户端发出了SET TX_ISOLATION=?,将不会禁用multiplexing。

当有不同客户端使用了不同的tx_isolation时,这将是一个bug,但一般所有客户端都使用默认的tx_isolation(绝大多数情况都如此)。

Ad-hoc enable/disable of multiplexing

mysql_query_rules.multiplexing允许基于匹配标准来启用/禁用multiplexing。当前该字段可接受的值有:

  • 0 : 禁用multiplexing
  • 1 : 启用multiplexing
  • 2 : 对于包含了@的查询语句不禁用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 = ?','');

ProxySQL(12):禁止多路路由的更多相关文章

  1. MySQL中间件之ProxySQL(12):禁止多路路由

    返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.html 1.multiplexing multiplexing,作用是将语句分 ...

  2. Directx11教程(12) 禁止alt+enter全屏窗口

    原文:Directx11教程(12) 禁止alt+enter全屏窗口        在D3D11应用程序中,我们按下alt+enter键,会切换到全屏模式.有时候,我们在WM_SIZE中有一些代码,全 ...

  3. MySQL/MariaDB系列文章目录

    以下是本系列文章的大纲,此页博文完全原创,花费了作者本人的极大心血,如转载,请务必标明原文链接. 如果觉得文章不错,还请帮忙点下"推荐",各位的支持,能激发和鼓励我更大的写作热情. ...

  4. MySQL中间件之ProxySQL(7):详述ProxySQL的路由规则

    返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.html 1.关于ProxySQL路由的简述 当ProxySQL收到前端app发 ...

  5. 9.12 Django路由

    2018-9-12 12:14:29 路由就是根据具体业务需求写的! 有的业务多,路由多,然后就需要细化 然后根据需求该! 怎么方便怎么来! 越努力,越幸运! 贴上笔记! 路由url根据需要可用修改, ...

  6. ProxySQL(7):详述ProxySQL的路由规则

    文章转载自:https://www.cnblogs.com/f-ck-need-u/p/9300829.html 关于ProxySQL路由的简述 当ProxySQL收到前端app发送的SQL语句后,它 ...

  7. MySQL ProxySQL读写分离实践

    目的 在上一篇文章MySQL ProxySQL读写分离使用初探里初步介绍了ProxySQL的使用,本文继续介绍它的一些特点和DBProxy的性能差异.深入一些去了解ProxySQL,通过测试来说明Pr ...

  8. ProxySQL 配置详解及读写分离(+GTID)等功能说明 (完整篇)

    ProxySQL是灵活强大的MySQL代理层, 是一个能实实在在用在生产环境的MySQL中间件,可以实现读写分离,支持 Query 路由功能,支持动态指定某个 SQL 进行 cache,支持动态加载配 ...

  9. Centos7.5部署MySQL5.7基于GTID主从复制+并行复制+半同步复制+读写分离(ProxySQL) 环境- 运维笔记 (完整版)

    之前已经详细介绍了Mysql基于GTID主从复制的概念,原理和配置,下面整体记录下MySQL5.7基于GTID主从复制+并行复制+增强半同步复制+读写分离环境的实现过程,以便加深对mysql新特性GT ...

随机推荐

  1. 提名 Apache ShardingSphere Committer,说说方法

    文章首发在公众号(龙台的技术笔记),之后同步到博客园和个人网站:xiaomage.info 就在前几天,收到了 Apache ShardingSphere Vote 我成为 Committer 的邮件 ...

  2. MySQL--数据过滤(AND、OR、IN、NOT操作符)

    MySQL允许给出多个WHERE子句.这些子句可以两种方式使用:以AND子句的方式或OR子句的方式使用. 1.组合WHERE子句 1.1 AND操作符 SELECT prod_id,prod_pric ...

  3. 翟佳:高可用、强一致、低延迟——BookKeeper的存储实现

    分享嘉宾:翟佳 StreamNative 联合创始人 编辑整理:张晓伟 美团点评 出品平台:DataFunTalk 导读:多数读者们了解BookKeeper是通过Pulsar,实际上BookKeepe ...

  4. 2022-7-9 第五小组 潘堂智 html学习笔记

    什么是 HTML? HTML 是用来描述网页的一种语言. HTML 指的是超文本标记语言 (Hyper Text Markup Language) HTML 不是一种编程语言,而是一种标记语言 (ma ...

  5. 面试题:Java中为什么只有值传递?

    作者:小牛呼噜噜 | https://xiaoniuhululu.com 计算机内功.JAVA底层.面试相关资料等更多精彩文章在公众号「小牛呼噜噜 」 目录 经典的问题 形参&实参 Java是 ...

  6. 60行从零开始自己动手写FutureTask是什么体验?

    前言 在并发编程当中我们最常见的需求就是启动一个线程执行一个函数去完成我们的需求,而在这种需求当中,我们常常需要函数有返回值.比如我们需要同一个非常大的数组当中数据的和,让每一个线程求某一个区间内部的 ...

  7. [51nod 1822]序列求和

    \(k\leq 200000\) 考虑转化成枚举 \(k\) 的形式 我们错位相减! \[A_k=\sum_{i=1}^N i^K\times R^i \\ RA_k=\sum_{i=2}^{N+1} ...

  8. SpringBoot的创建和特性

    一.SpringBoot的特点 创建独立的Spring应用程序 直接嵌入Tomcat.Jetty或Undertow(无需部署WAR文件) 提供自以为是的"starter"依赖项,以 ...

  9. 透过inode来理解硬链接和软链接

    什么是inode? 每个文件都对应一个唯一的inode,inode用来存储文件的元信息,包括: 对应的文件 文件字节数 文件数据块的位置 文件的inode号码 文件的硬链接数 文件的读写权限 文件的时 ...

  10. Jira使用浅谈篇一

    本篇参考: https://www.jianshu.com/u/9dd427d9ad94 Salesforce 生命周期管理(二)Agile & Scrum 浅谈 我们都知道 salesfor ...