『MySQL 实战 45 讲』22 - MySQL 有哪些“饮鸩止渴”提高性能的方法?

MySQL 有哪些“饮鸩止渴”提高性能的方法?

  1. 需求:业务高峰期,生产环境的 MySQL 压力太大,没法正常响应,需要短期内、临时性地提升一些性能

短连接风暴

  1. 短连接模式:执行很少的 SQL 语句就断开,下次需要的时候再重连。如果使用的是短连接,在业务高峰期的时候,就可能出现连接数突然暴涨的情况
  2. max_connections 参数,用来控制一个 MySQL 实例同时存在的连接数的上限,被拒绝的连接的请求,从业务角度就是数据库不可用
  3. 机器负载比较高时,处理现有请求的时间变长,每个连接保持的时间也更长,就有可能超过 max_connections 参数
  4. 一个比较自然的想法,就是调高 max_connections 的值,但是系统的负载可能进一步加大,并且量的资源耗费在权限验证等逻辑上

第一种方法:先处理掉那些占着连接但是不工作的线程

  1. 对于不需要保持的连接,可以通过 kill connection 主动踢掉,相当于设置 wait_timeout 参数效果一样
  • wait_timeout 参数:一个线程空闲 wait_timeout 这么多秒之后,就会被 MySQL 直接断开连接
  1. 例如下面例子
    在这里插入图片描述
  • 可以用过 SELECT CONNECTION_ID(); 查询当前会话 id
  • 通过 show processlist; 查看进程结果,其中 109 为 A,110 为 B,112 为 C,从而可以看到哪些会话是 Sleep 状态
    在这里插入图片描述
  • 通过 select * from information_schema.innodb_trx\G 可以看到事务具体状态
    在这里插入图片描述
  • 其中 trx_mysql_thread_id=109 表示 id = 109 A 线程还在事务中
  • 从服务端断开连接使用的是 kill connection + id
    在这里插入图片描述
  • 它的连接被服务端主动断开后,这个客户端并不会马上知道。直到客户端在发起下一个请求的时候,才会收到这样的报错
    在这里插入图片描述
  • 注意:从数据库端主动断开连接可能是有损的,尤其是有的应用端收到这个错误后,不重新连接,而是直接用这个已经不能用的句柄重试查询。这会导致从应用端看上去,“MySQL 一直没恢复”。

第二种方法:减少连接过程的消耗

  1. 有的业务代码会在短时间内先大量申请数据库连接做备用,从而导致服务打挂,那么一种可能的做法,是让数据库跳过权限验证阶段
  2. 跳过权限验证的方法:
  • 重启数据库,并使用 –skip-grant-tables 参数启动
  • 注意:风险极高,特别是外网访问
  • 若确定开启该参数,MYSQL8 会默认把 --skip-networking 参数打开,表示这时候数据库只能被本地的客户端连接

慢查询性能问题

  1. 大体有以下三种可能
  • 索引没有设计好
  • SQL 语句没写好
  • MySQL 选错了索引

导致慢查询的第一种可能是,索引没有设计好

  1. 这种场景一般就是通过紧急创建索引来解决
  • MySQL 5.6 版本以后,创建索引都支持 Online DDL
  • 对于那种高峰期数据库已经被这个语句打挂了的情况,最高效的做法就是直接执行 alter table 语句
  1. 比较理想的是能够在备库先执行。假设你现在的服务是一主一备,主库 A、备库 B,大致流程是这样的
  • 在备库 B 上执行 set sql_log_bin=off,也就是不写 binlog,然后执行 alter table 语句加上索引
  • 执行主备切换
  • 这时候主库是 B,备库是 A。在 A 上执行 set sql_log_bin=off,然后执行 alter table 语句加上索引
  1. 这是一个“古老”的 DDL 方案。平时在做变更的时候,你应该考虑类似 gh-ost 这样的方案,更加稳妥。但是在需要紧急处理时,上面这个方案的效率是最高的

导致慢查询的第二种可能是,语句没写好

  1. 我们可以通过改写 SQL 语句来处理。MySQL 5.7 提供了 query_rewrite 功能,可以把输入的一种语句改写成另外一种模式
  2. MYSQL 8 安装 install_rewriter 插件,需要从 share 目录找到 install_rewriter.sql 脚本
# 登录
mysql -uroot -p 
# 执行脚本
source install_rewriter.sql
# 查看是否有 Rewriter 插件
show plugins
# 查看是否改写开启
show variables like '%rewrite%'
  1. 例如语句被错误地写出了 select * from t where id + 1 = 10000,可以通过下面方式改写规则
# 其中 testdb 是你的库
mysql> insert into query_rewrite.rewrite_rules(pattern, replacement, pattern_database) values ("select * from t where id + 1 = ?", "select * from t where id = ? - 1", "testdb");
# 这个存储过程,是让插入的新规则生效,也就是我们说的“查询重写
call query_rewrite.flush_rewrite_rules();
  • 通过 show warnings 可以看到是否生效

在这里插入图片描述

MySQL 选错了索引

  1. 应急方案是在语句加上 force index

总结

  1. 由慢查询导致性能问题的三种可能情况,实际上出现最多的是前两种
  2. 可以通过下面过程,预先发现问题
  • 上线前,把慢查询日志(slow log)打开,并且把 long_query_time 设置成 0,确保每个语句都会被记录入慢查询日志
  • 在测试表里插入模拟线上的数据,做一遍回归测试
  • 观察慢查询日志里每类语句的输出,特别留意 Rows_examined 字段是否与预期一致
  1. 新增的 SQL 语句不多,手动跑一下就可以。而如果是新项目的话,或者是修改了原有项目的表结构设计,全量回归测试都是必要的。这时候,你需要工具帮你检查所有的 SQL 语句的返回结果。比如,你可以使用开源工具 pt-query-digest

QPS 突增问题

  1. 有时候由于业务突然出现高峰,或者应用程序 bug,导致某个语句的 QPS 突然暴涨,也可能导致 MySQL 压力过大,影响服务
  • 理想的情况:让业务把这个功能下掉
  1. 如果从数据库端处理的话,对应于不同的背景,有不同的方法可用
  • 一种是由全新业务的 bug 导致的:如果 DB 运维是比较规范的,说白名单是一个个加的。这种情况下,如果你能够确定业务方会下掉这个功能,只是时间上没那么快,那么就可以从数据库端直接把白名单去掉
  • 这个新功能使用的是单独的数据库用户,可以用管理员账号把这个用户删掉,然后断开现有连接
  • 这是一个止血方案,最低优先级)这个新增的功能跟主体功能是部署在一起的,那么我们只能通过处理语句来限制。这时,我们可以使用上面提到的查询重写功能,把压力最大的 SQL 语句直接重写成"select 1"返回
    • 注意:这个操作风险会很高
    • 如果别的功能里面也用到了这个 SQL 语句模板,会有误伤
    • 很多业务并不是靠这一个语句就能完成逻辑的,所以如果单独把这一个语句以 select 1 的结果返回的话,可能会导致后面的业务逻辑一起失败
  1. 前 2 个方案都要依赖于规范的运维体系:虚拟化、白名单机制、业务账号分离

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/758456.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

等保测评练习卷15

等级保护初级测评师试题15 姓名: 成绩: 判断题(10110分) 1. 防火墙应关闭不需要的系统服务、默认共享和高危端口,可以有效降低系统遭受攻击的可能性。&am…

学会整理电脑,基于小白用户(无关硬件升级)

如果你不想进行硬件升级,就要学会进行整理维护电脑 基于小白用户,每一个操作点我都会在后续整理出流程,软件推荐会选择占用小且实用的软件 主要从三个角度去讨论【如果有新的内容我会随时修改,也希望有补充告诉我,我…

【数据结构】详解二叉树之堆

失败只是暂时停止成功,假如我不能,我就一定要;假如我要,我就一定能!💓💓💓 目录 ✨说在前面 🍋知识点一:树的概念和结构 • 🌰1.什么是树&#x…

什么是自然语言处理(NLP)?详细解读文本分类、情感分析和机器翻译的核心技术

什么是自然语言处理? 自然语言处理(Natural Language Processing,简称NLP)是人工智能的一个重要分支,旨在让计算机理解、解释和生成人类的自然语言。打个比方,你和Siri对话,或使用谷歌翻译翻译一…

h5兼容table ,如何实现h5在app内使用h5渲染table表格而且实现横屏预览?

压图地址 横屏div 通过css 实现 transform: rotate(90deg); transformOrigin: 50vw 50vw ; height: 100vw; width: 100vh;<divclass"popup-box":style"{transform: originSet 0 ? rotate(90deg) : ,transformOrigin: originSet 0 ? 50vw 50vw : ,height…

正版软件 | R-Studio T80+:数据恢复与取证分析的专业之选

在数据恢复和数字取证领域&#xff0c;专业人士需要一款强大、可靠的工具来应对复杂和高要求的任务。R-Studio T80 由 R-TT 公司推出的新型许可软件&#xff0c;以其年度付费订阅模式&#xff0c;为专家提供了成本效益更高的解决方案。 全面功能&#xff0c;专业服务 R-Studio …

如何在 Linux 中后台运行进程?

一、后台进程 在后台运行进程是 Linux 系统中的常见要求。在后台运行进程允许您在进程独立运行时继续使用终端或执行其他命令。这对于长时间运行的任务或当您想要同时执行多个命令时特别有用。 在深入研究各种方法之前&#xff0c;让我们先了解一下什么是后台进程。在 Linux 中…

秋招突击——6/28、6.29——复习{数位DP——度的数量}——新作{}

文章目录 引言复习数位DP——度的数量个人实现参考实现 总结 引言 头一次产生了那么强烈的动摇&#xff0c;对于未来没有任何的感觉的&#xff0c;不知道将会往哪里走&#xff0c;不知道怎么办。可能还是因为实习吧&#xff0c;再加上最近复习也没有什么进展&#xff0c;并不知…

AI助力校园安全:EasyCVR视频智能技术在校园欺凌中的应用

一、背景分析 近年来&#xff0c;各地深入开展中小学生欺凌行为治理工作&#xff0c;但有的地方学生欺凌事件仍时有发生&#xff0c;严重损害学生身心健康&#xff0c;引发社会广泛关注。为此&#xff0c;教育部制定了《防范中小学生欺凌专项治理行动工作方案》进一步防范和遏…

2,linux服务器使用学习

目录 服务器使用-SSH 介绍 使用 OpenSSH-Linux FinalShell-Windows 阿里云服务器使用示例 领取免费账号 进行登录 服务器使用-SSH 介绍 Secure Shell(SSH) 是由 IETF(The Internet Engineering Task Force) 制定的建立在应用层基础上的安全网络协议。它是专为远程登…

拆分盘投资策略解析:机制、案例与风险考量

一、引言 随着互联网技术的迅猛发展和金融市场的不断创新&#xff0c;拆分盘这一投资模式逐渐崭露头角&#xff0c;成为投资者关注的焦点。它基于特定的拆分策略&#xff0c;通过调整投资者持有的份额和单价&#xff0c;实现了看似稳健的资产增长。本文旨在深入探讨拆分盘的运…

Meven

目录 1.简介2.Maven项目目录结构2.1 约定目录结构的意义2.2 约定大于配置 3. POM.XML介绍3.2 依赖引用3.3 属性管理 4 Maven生命周期4.1 经常遇到的生命周期4.1 全部生命周期 5.依赖范围&#xff08;Scope&#xff09;6. 依赖传递6.1 依赖冲突6.2 解决依赖冲突6.2.1 最近依赖者…

【wsl2】升级wsl及ubuntu22.04

y9kp的wsl2 还是用的自己的子网 很久没用wsl2的ubutnu22.04系统 发现无法启动 等待了挺久&#xff0c;启动了 但同时我也在升级wsl中&#xff1a; 升级wsl wsl --update 这个升级是对ubuntu22.04的运行没影响。 apt-get update 然后upgrade wsl2的升级一直在90%多不动 然…

算法 —— 双指针

目录 移动零 复写零 快乐数 盛最多水的容器 有效三角形的个数 查找总价格为目标值的两个商品 三数之和 四数之和 移动零 下图以样例1为例&#xff0c;看下图如何做到保证非零元素相对顺序前提下&#xff0c;移动零元素。 代码实现如下&#xff1a; class Solution {…

数据结构—判断题

1.数据的逻辑结构说明数据元素之间的顺序关系&#xff0c;它依赖于计算机的存储结构。 答案&#xff1a;错误 2.(neuDS)在顺序表中逻辑上相邻的元素&#xff0c;其对应的物理位置也是相邻的。 答案&#xff1a;正确 3.若一个栈的输入序列为{1, 2, 3, 4, 5}&#xff0c;则不…

加密与安全_三种方式实现基于国密非对称加密算法的加解密和签名验签

文章目录 国际算法基础概念常见的加密算法及分类签名和验签基础概念常见的签名算法应用场景 国密算法对称加密&#xff08;DES/AES⇒SM4&#xff09;非对称加密&#xff08;RSA/ECC⇒SM2&#xff09;散列(摘要/哈希)算法&#xff08;MD5/SHA⇒SM3&#xff09; Code方式一 使用B…

3、Redis集群原理分析

槽定位 (Slot Mapping): Redis Cluster 将所有数据划分为 16384 个槽位&#xff08;slots&#xff09;&#xff0c;每个槽位由一个或多个节点负责管理。Redis 集群通过 CRC16 哈希算法来计算每个 key 的哈希值&#xff0c;并对 16384 取模以确定该 key 应该存储在哪个槽位上。…

Maven基础学习

一、Why? 1.真的需要吗? 2.究竟为什么? 二、What? 1.Maven简介 2.什么是构建 3.构建过程的几个主要环节 4.自动化构建 5.Maven核心概念 6.安装Maven 三、How? 四、约定的目录结构

详解HTTP:常用的密钥交换算法RSA与ECDHE

HTTPS 常用的密钥交换算法&#xff1a;RSA 与 ECDHE 在 HTTPS 中&#xff0c;密钥交换算法扮演了至关重要的角色&#xff0c;确保数据在传输过程中的安全性。目前常用的密钥交换算法主要有两种&#xff1a;RSA 和 ECDHE。相比于较为传统的 RSA&#xff0c;ECDHE 由于具备前向安…

“论大数据处理架构及其应用”写作框架,软考高级,系统架构设计师

论文真题 大数据处理架构是专门用于处理和分析巨量复杂数据集的软件架构。它通常包括数据收集、存储、处理、分析和可视化等多个层面&#xff0c;旨在从海量、多样化的数据中提取有价值的信息。Lambda架构是大数据平台里最成熟、最稳定的架构&#xff0c;它是一种将批处理和流…