MySQL45讲之生产环境下的性能问题

本文介绍了一些常见的性能问题以及如何在生产环境中解决这些问题。

[En]

This article introduces some common performance problems and how to solve them in a production environment.

1. 短连接风暴

当大量短连接导致数据库性能不佳时,首先考虑一些无损的安全解决方案。如果需要立即提高某些数据库的性能,则可以考虑以下解决方案。

[En]

When database performance is poor due to a large number of short connections, consider some lossless security solutions first. If it is necessary to improve some database performance immediately, then you can consider the following solutions.

第一种方法:处理掉占着连接但空闲的线程

类似 MySQL wait_timeout 的逻辑,当检测到线程空闲(sleep状态)超过一定时间,就在服务端主动断开与客户端的连接,为后续新到来的连接腾出位置。

从数据库端断开连接的方法是有损的,因为应用端收到这个错误后,不会重新连接,而是用这个不能再用的句柄继续重试查询。这会导致从应用端看上去,”MySQL一直没恢复”。

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

一种减少损耗的方法是连接时不进行权限验证,即以 –skip-grant-tables 的方式重启 MySQL,这样后续的连接将不需要再进行权限验证。但是这样显然很不安全,所以 MySQL8.0 在开启 –skip-grant-tables 模式后,只允许本地客户端连接 MySQL。

2. 慢查询问题

有三种主要类型的慢查询问题:

[En]

There are three main types of slow query problems:

  • 索引设计不好
  • SQL语句没写好
  • 数据库选错索引

第一种情况:索引设计不好

原文复制:

MySQL5.6 以后可以 Online DDL,即支持在线更新表结构。所以,如果上线后发现索引没设计好,就可以在线 Alter Table。

比较理想的是能够在备库先执行。假设你现在的服务是一主一备,主库A、备库B,这个方案的大致流程是这样的:

在备库B上执行 set sql_log_bin=off,也就是不写binlog,然后执行alter table 语句加上索引;

执行主备切换;

这时候主库是B,备库是A。在A上执行 set sql_log_bin=off,然后执行alter table 语句加上索引。

这是一个”古老”的DDL方案。平时在做变更的时候,你应该考虑类似 gh-ost 这样的方案,更加稳妥。但是在需要紧急处理时,上面这个方案的效率是最高的。

第二种情况:SQL语句没写好

MySQL5.7 提供了 query_rewrite 插件实现 SQL 重写的功能,安装 query_rewrite 插件后,会多一个 query_rewrite 数据库,然后可以该数据库的 rewrite_rules 表中新增重写规则,举例:

mysql> insert into query_rewrite.rewrite_rules(pattern, replacement, pattern_database) values ("select * from t where id + 1 = ?", "select * from t where id = ? - 1", "db1");

call query_rewrite.flush_rewrite_rules();

第三种情况:数据库选错索引

在 SQL 语句上加上 force index 来强制选择索引,同样可以使用 query_rewrite 插件重写语句来解决。

原文复制:

在上述三种可能的情况中,前两种是最常见的,即指数设计不好,报表写得不好。而这两种情况是完全可以避免的。例如,通过以下过程,我们可以提前发现问题。

[En]

Of the above three possible situations, the first two are the most common, that is, the index is not well designed and the statement is not well written. And these two situations are completely avoidable. For example, through the following process, we can find the problem in advance.

(1)上线前,在测试环境,把慢查询日志(slow log)打开,并且把long_query_time设置成0,确保每个语句都会被记录入慢查询日志;

(2)在测试表里插入模拟线上的数据,做一遍回归测试;

(3)观察慢查询日志里每类语句的输出,特别留意Rows_examined字段是否与预期一致。

Original: https://www.cnblogs.com/flowers-bloom/p/mysql45-performance-issues.html
Author: flowers-bloom
Title: MySQL45讲之生产环境下的性能问题

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/508096/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 【Java代码之美】 — Java17新特性初探

    1.背景 Oracle与9月中旬正式宣布推出Java17,正如官方所说: JDK17是最新的长期稳定支持的版本作为JDK11之后的下一个长期支持的版本; 也是Spring Fram…

    数据库 2023年6月6日
    0101
  • Mybatis的级联查询,分步查询,一对一,一对多和多对一

    配置和代码目录 ***util配置 ***log4j配置 –可以打印入日志,也可以使用系统自带的STDOUT_LOGGING个人喜欢log4j ***mybatis-c…

    数据库 2023年5月24日
    093
  • MYSQL–>函数与约束条件

    函数最常用的地方就是查询语句处 select 函数(字段) from &#x8868…

    数据库 2023年6月14日
    098
  • django中批量插入数据

    1.什么是批量插入 在django中的orm给我们提供了一个bulk_create方法,批量创建插入数据! 2.为什么要使用批量插入 让我们首先来看看不使用大容量插入的情况: [E…

    数据库 2023年5月24日
    090
  • Docker三种文件系统总结

    概述 容器持久化,相比小伙伴都不陌生。通过Docker的volume,我们可以非常方便的实现容器数据的持久化存储。但volume之下的文件系统,相比许多小伙伴并不是非常清楚。因而本…

    数据库 2023年6月11日
    0148
  • tomcat线程池

    tomcat线程池和普通的线程池设计上有所区别,下面主要来看看它是如何设计的 tomcat中线程池的创建 <span>org.apache.tomcat.util.ne…

    数据库 2023年6月16日
    089
  • How to code like a pro in 2022 and avoid If-Else

    高级开发人员如何编写代码: var input = "Dog"; var map = new Dictionary<string, string> …

    数据库 2023年6月11日
    074
  • tomcat服务的原理和使用

    一、tomcat与服务器的关系 服务器是指安装了服务器软件的计算机,而服务器软件是指接收用户请求,处理请求,返回请求结果的程序,常见的服务器软件有tomcat、iis等,也称为we…

    数据库 2023年6月14日
    0120
  • PLSQL_developer安装与配置

    前言: 记录安装与配置操作 环境: 客户机:windows服务器:虚拟机中的windows server 2003/————&#82…

    数据库 2023年6月11日
    093
  • 正则表达式=Regex=regular expression

    正则表达式=Regex=regular expression 反向引用*2 \index索引引用 \b(\w+)\b\s+\1\b \k \b(? 数量符/限定符62 贪婪Gree…

    数据库 2023年6月15日
    071
  • zabbix监控用户,模组管理

    zabbix用户模组管理 用户管理 用户组 用户角色 用户 模板管理 模板组 模板 模板的监控项的参数也可以copy来 加入触发器 导出模板查看格式 posted @2022-09…

    数据库 2023年6月14日
    058
  • Django后台美化

    Django后台美化 1.Xadmin 1.1 安装 通过如下命令安装xadmin的最新版: pip install https://github.com/sshwsfc/xadm…

    数据库 2023年6月14日
    095
  • ElasticSearch的简单api介绍

    1:ElasticSearch是什么? Elasticsearch 是一个分布式的免费开源搜索和分析引擎 适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型的数据…

    数据库 2023年6月6日
    083
  • 希望腿上的伤快点好

    明天去星巴克泡一会儿想把一些课程关联到的课程学习一下 Original: https://www.cnblogs.com/ukzq/p/16747859.htmlAuthor: D…

    数据库 2023年6月11日
    097
  • 了解Threejs中的Clock对象以及简单应用

    什么是Clock对象 如果你对 JavaScript 有一定了解,那么 JavaScript 的时间对象 Date 你一定不陌生,Clock 本质上就是对 Date 进行封装,提供…

    数据库 2023年6月11日
    095
  • 第一篇博客

    这是我在博客园的第一篇博客,用来纪念以下,同时也是写博客的试水标记 Original: https://www.cnblogs.com/zht1702/p/15081310.htm…

    数据库 2023年6月14日
    069
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球