首页 > 数据库 >Mysql 系列 | 性能优化 - 紧急临时处理

Mysql 系列 | 性能优化 - 紧急临时处理

时间:2022-10-20 18:24:54浏览次数:40  
标签:语句 数据库 查询 索引 紧急 Mysql 优化 连接

在实际开发过程中,业务高峰期常遇到 Mysql 响应变慢。为了不影响业务,要在短时间内临时提升性能。


短链接

原因分析

  • 短链接是连接数据库后,执行很少的 SQL 后就断开,下次需要的时候再重新连接。这种情况很容易出现连接突然暴涨的情况

  • Mysql 建立连接时除了网络连接三次握手外,还要权限判断和获取权限,成本较高。当响应变慢时,连接数就会暴涨

  • Mysql 实例存在连接数上限,由参数 max_connections 设定。超出后会拒绝接下来的连接请求,导致业务瘫痪

解决方案

  • 调高 max_connections 参数值,但是过多的连接进来,会耗费大量资源来校验权限,导致线程没有 CPU 资源处理请求

  • 处理掉不工作的线程

    • 在 showprocesslist 的结果里,踢掉显示为 sleep 的线程,可能存在没提交的事务,是有损的。

    • 可以查 information_schema 库的 innodb_trx 表。优先断开事务外空闲太久的连接,再考虑事务内空闲连接

    • 服务端断开连接用 kill connection + id。主动断开连接,当应用端收到错误信息后不重新连接,而是直接用错误句柄重试查询,会导致业务代码没有处理好的地方直接报错。

  • 减少连接过程的消耗,让数据库跳过权限验证阶段。

    • 重启数据库,并加上 –skip-grant-tables 参数,连接过程和语句执行过程都会跳过验证。但是风险极高,尤其是外网可访问数据库时。

    • Mysql8.0 中,启用 用–skip-grant-tables参数,会默认打开–skip-grant-tables参数,让数据库只能被本地客户端连接。

慢查询

原因分析

  • 可能出现慢查询的情况,

    • 索引设计不合理

    • SQL 语句不合理

    • Mysql 选错了索引

解决方案

  • 针对索引不合理

    • 紧急创建索引

    • 先在备库执行 set sql_log_bin = off,不再记 binlog,然后alter table加索引。第二步主备切换。第三步在切换后的备库上执行第一步的操作

  • 针对语句没写好

    • 改写 SQL 语句,用 query_rewrite功能,把输入的语句改写成另一种模式
  • 针对选错索引

    • 给语句加上force index,也可以使用上面说到的查询重写功能

QPS 突增

原因分析

  • 业务突然出现高峰或者程序 bug,导致数据库压力过大

解决方案

  • 要根据具体的业务代码决定

    • 如果是新功能,可以先把新功能下线,把相关连接全部关掉。如果用了单独的数据库用户,则把用户删掉。

    • 如果不能下线,则通过处理语句来限制。使用查询重写功能,直接重写成 select 1 返回。当然前提是不会影响到重要业务逻辑,一旦导致误伤会比较严重,优先级较低

预防措施

  • 上线前测试环境打开 slow log,设置long_query_time=0,确保每条语句都记录再慢日志

  • 测试表中模拟线上数据,回归测试

  • 检查测试环境慢日志中 Rows_examined 字段是否符合预期

  • 规范数据库使用规则,虚拟化、白名单机制、作业账号分离



项目中数据出现问题,一般都会比较严重。

提前做好数据审计,避免不必要的尴尬。

标签:语句,数据库,查询,索引,紧急,Mysql,优化,连接
From: https://www.cnblogs.com/rendd/p/16810812.html

相关文章

  • Navicat for MySQL 批量执行多个 SQL 文件---Windows-Type命令
    1.背景描述有个同事给发了一个数据库初始化sql文件夹,里面是有99个.sql文件,而我本地的数据库客户端是NavicatforMySQL,不论是在数据库上右键运行SQL文件还是在查询界面的......
  • HeidiSQL、Navicat、mysql命令和source命令导入sql脚本的速度比较
    一、四种导入方式的比较1、heidisql客户端是一条一条插入的,速度最慢,而且很脆弱比较容易崩溃;2、mysql命令导入380万记录用时1小时13分(属于前台运行的命令,ctrl+c就可以结束......
  • Mysql变量插入中文失败
    当给变量赋值中文时,报错:mysql>createprocedurepro_test4()->begin->declareheightintdefault175;->declaredescriptionvarchar(50)default......
  • CentOs 7 安装mysql(5.7.27)数据库
    CentOs7安装MySQL1.查看是否已经安装Mysql[root@srv01~]# rpm-qa|grepmysql# 如果你查看出来有东西,可以使用下面命令将其删除[root@srv01~]# ......
  • 【路径规划】基于麻雀算法的路径优化问题附matlab代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • MySQL分组排序取每组第一条
    1.使用group_concat函数,但是弊端只能查询groupby后的字段参考: MySQL分组排序取每组第一条(最大值、最小值)MySQL的GROUP_CONCAT函数详解效果: ......
  • MySQL-class
    数据库和SQL概念数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它的产生距今已有六十多年。随着信息技术和市场的发展,数据库变的无处不在:它在电子商务、......
  • mysql系列-常用语句
    一查看空间碎片-库维度   selecttable_schemaas'数据库',sum(table_rows)as'记录数',sum(truncate(data_length/1024/1024/1024,2))as'数据容量(GB)'......
  • MySQL-explain
    转自:https://www.cnblogs.com/ciel717/p/16180093.html通常查询慢查询SQL语句时会使用EXPLAIN命令来查看SQL语句的执行计划,通过返回的信息,可以了解到Mysql优化器是如何执......
  • Mysql 身份认证绕过漏洞(CVE-2012-2122)
    参考文章:http://t.csdn.cn/CJuGe搭建环境https://vulhub.org/#/environments/mysql/CVE-2012-2122/主机准备准备两台主机,一台ubuntu(192.168.12.137),一台kail,均处于......