如何调优和优化 MySQL
在开始之前,我们想提醒您,MySQL 调优(或者任何其他 Linux 服务调优)是一个非常广泛的话题,我们无法在一篇博文中涵盖所有内容。在本文中,我们将探讨如何在一定程度上避免数据库性能瓶颈。
我们可以检查多个 MySQL 变量,从而大致了解服务器上数据库服务的当前性能水平,但这确实是一项耗时且艰巨的任务。
如果我们能够自动执行这些检查,并获得一份关于当前 MySQL 性能状态的简要报告,那会怎么样?
隆重推出……MySQL 调优工具!这是一个用 Perl 语言编写的简洁实用的小脚本,可以验证 MySQL 安装情况,并提供一份简要报告以及一些性能优化建议。接下来,让我们一起来看看如何运行 MySQL 调优工具:
步骤一:从这里下载调谐器脚本:
wget https://github.com/major/MySQLTuner-perl/blob/461c8fb60e032ce29172393d38183549331fa840/mysqltuner.pl
步骤 2:赋予 mysqltuner.pl 文件执行权限以运行该脚本。
chmod +x mysqltuner.pl
步骤 3:运行脚本
./mysqltuner.pl
您可能需要提供 MySQL 管理员登录信息。
脚本运行完毕后,请仔细阅读建议,并根据您的实际使用情况决定实施哪些建议。不过,您可以放心地修改某些 MySQL 参数,立即提升整体性能,这些参数包括:
键缓冲区
通过更改 key_buffer 参数,您可以控制分配给 MySQL 的内存。假设您有足够的可用内存,这可以显著提升数据库速度。一般而言,在使用 MyISAM 表引擎时,key_buffer 的大小不应超过系统内存的 25%;而对于 InnoDB,则不应超过 70%。如果此值设置过高,则会造成资源浪费。
根据 MySQL 官方文档,对于内存为 256MB(或更多)且拥有大量表的服务器,建议使用 64MB 的 key_buffer 值,默认值为 16MB。您可以尝试更大的值,找到最适合您服务器的设置,但务必在做出决定前监控服务器负载统计信息。
innodb_buffer_pool_size
InnoDB 缓冲池是优化 MySQL/MariaDB 的关键组件。它用于存储数据和索引。通常情况下,我们可以尽可能地增大缓冲池的大小,以便将尽可能多的数据和索引保存在内存中,从而减少磁盘 I/O 这一主要瓶颈。因此,如果服务器专门用于处理 SQL 查询,则缓冲池的典型值在系统内存的 70% 到 80% 之间。
此值仅适用于使用 InnoDB 作为其 SQL 存储引擎的 SQL 服务。
要了解当前使用的存储引擎,请按照以下教程操作:
https://dev.mysql.com/doc/refman/5.7/en/innodb-check-availability.html
最大允许数据包
使用此参数,您可以设置数据包的最大大小。对于不熟悉此概念的用户,数据包可以是单个 SQL 状态、发送给客户端的单行数据,也可以是从源数据库发送到副本的日志。如果您的用例涉及处理大型数据包,最好将此值增加到最大数据包的大小。如果此值设置得太小,您将在错误日志中收到错误信息。
线程缓存大小
如果 `thread_cache_size` 设置为 0,则缓存功能实际上处于关闭状态,任何新建立的连接都需要创建一个新线程。连接关闭时,相应的线程会被销毁。`thread_cache_size` 参数控制着缓存中存储的未使用线程数量,直到这些线程可以被其他连接重新利用。如果您每分钟收到数百个连接,则应增加此值,以便大多数连接都能利用缓存的线程。
最大连接数
此值设置最大并发连接数。在设置此值之前,最好先考虑您过去的最大连接数,以便在最大连接数和 `max_connections` 值之间留出一定的缓冲空间。请注意,这并非表示您网站在任何给定时间的最大用户数,而是表示同时接收的最大请求数。
选项不止于此,但在将默认值以外的值应用于其他 SQL 配置参数之前要谨慎,因为如果您的工作负载类型与您应用的配置不匹配,则可能会导致无法预见的问题。
尖端:
- 在修改 MySQL 参数之前,务必先备份 /etc/my.cnf 文件。
- 每次进行更改后都重启 MySQL 服务,这将有助于您确定哪些更改可能有效,哪些无效。
- 实施 MySQL 调优建议并非一劳永逸,您必须根据正在处理的数据量或系统垂直扩展情况定期优化服务参数。