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)

大家都在看

  • 实验:非GTID 一主多从变级联架构

    个个原创文章 欢迎讨论https://www.cnblogs.com/konggg/欢迎转载收藏,转载请注明来源,谢谢支持! Original: https://www.cnblo…

    数据库 2023年6月16日
    0123
  • MySQL 事务和锁

    事务概述 当多个用户访问相同的数据时,在更改数据的过程中,其他用户可能会同时发起更改请求,为了确保数据库记录的更新从一种一致性状态更改为另一种一致性状态,需要使用事务处理,它具有以…

    数据库 2023年5月24日
    067
  • FastDFS安装和简介详细总结

    1、fastDFS简介 1 FastDFS是用c语言编写的一款开源的分布式文件系统。 2 FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用…

    数据库 2023年6月14日
    0113
  • Dubbo源码(一)-SPI使用

    Dubbo 的可扩展性是基于 SPI 去实现的,而且Dubbo所有的组件都是通过 SPI 机制加载。 SPI 全称为 (Service Provider Interface) ,是…

    数据库 2023年6月11日
    099
  • mydumper备份mysql8.0 sql thread被kill掉

    这个问题是很久以前的事了。今天,我看了看我的笔记,发现了这个问题。我当时没有仔细看过它。我现在就想复制它。 [En] This problem was a long time ag…

    数据库 2023年5月24日
    0116
  • html学习笔记

    学完html基本以后,现在对html知识做以下总结: 以上内容来源于bilibiliup狂神说 html html,即超文本标记语言(Hyper Text Markup Langu…

    数据库 2023年6月14日
    091
  • Angel工作室ASP.NET(AngelExam)开源驾校考试系统正式发布

    一、Angel工作室ASP.NET(AngelExam)开源驾校考试系统简介 Angel工作室ASP.NET(AngelExam)驾校考试系统是基于asp.net mvc4.5(C…

    数据库 2023年6月14日
    085
  • Qt 保持窗口顶层显示最简单方法

    情景: 当前存在两个窗口或以上,先初始化的窗口会被后初始化的窗口覆盖,从而置于底层, 这时一个最简单的方案就是给需要置于顶层的窗口配置事件过滤器,监听窗口状态,当窗口不属于顶层窗口…

    数据库 2023年6月16日
    0128
  • [Mysql]Ubuntu如何安装Mysql+启用远程连接[完整版]

    嗯。以下是我踩了好几个小时的所有坑总结出来的血泪史。我希望我能帮你少踩几个坑。正常情况下,一步一步地,不会有任何问题。 [En] Yeah. The following is th…

    数据库 2023年5月24日
    0105
  • Linux–>常用指令

    Linux的选项可以组合使用比如说ls -al这种 pwd 指令 作用:查看当前所在目录的 绝对路径 语法: pwd ls 指令 作用:显示当前目录下所有文件 语法: ls &am…

    数据库 2023年6月14日
    0178
  • 自动化测试练手项目推荐

    转载请注明出处❤️ 作者:测试蔡坨坨 原文链接:caituotuo.top/80599ac8.html 你好,我是测试蔡坨坨。 最近收到许多自学自动化测试的小伙伴私信,学习了理论知…

    数据库 2023年6月11日
    0118
  • Redis-IO模型

    即便是单线程,Redis还是那么快? 一说到Redis的IO模型,就会说到Redis是”单线程”处理的。这里的单线程,主要是指 网络IO和键值读写,也就是处…

    数据库 2023年6月11日
    0116
  • [Mysql]如何查看初次安装后的默认密码

    mysql初次安装时,会设置一个临时密码,不允许用空密码直接登录: ubuntu系统上这个密码的存放位置是 /etc/mysql/debian.cnf Original: http…

    数据库 2023年6月16日
    092
  • 记录不存在则插入,存在则更新 → MySQL 的实现方式有哪些?

    开心一刻 今天,爸爸、我和女儿一起吃了晚饭,我们每人都吃了一只鸡腿。 [En] Today, my father, me and my daughter had dinner to…

    数据库 2023年5月24日
    0104
  • webclient设置代理

    https://qa.1r1g.com/sf/ask/4102971771/ 本文来自博客园,作者:ukyo–BlackJesus,转载请注明原文链接:https://…

    数据库 2023年6月11日
    075
  • Redis-缓存雪崩,击穿,穿透

    小结 布隆过滤器 工作原理:布隆过滤器是一个由初值为0的长度为L的bit数组和N个哈希函数组成。当有向数据库写入操作时,对键进行N次哈希值计算,并对计算后的值取L的模,对数组相应位…

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