加入收藏 | 设为首页 | 会员中心 | 我要投稿 拼字网 - 核心网 (https://www.hexinwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

mysql配置错误_MySQL常见的配置错误及解决方案

发布时间:2022-12-06 14:03:52 所属栏目:MySql教程 来源:未知
导读: 我收到的支持请求电子邮件的一个常见主题是MySQL数据库性能。客户抱怨MySQL使用过多的服务器内存,太多的MySQL慢查询,著名的Mysql服务器已消失错误 以及许多其他与MySQL性能相关的问题。因

我收到的支持请求电子邮件的一个常见主题是MySQL数据库性能。客户抱怨MySQL使用过多的服务器内存,太多的MySQL慢查询,著名的Mysql服务器已消失错误 以及许多其他与MySQL性能相关的问题。因此,我想快速分享常见MySQL配置错误的解决方案。到目前为止,我已经看到了大约十二次。

ff896f623129bff08fa58d98cfd10359.png

如果您是DBA,请随时在评论部分分享您的经验或任何建议。我指的是四个MySQL配置变量。四行通常是由于缺少用于传入连接的服务器内存而导致MySQL数据库性能不佳和扩展不佳的原因。

避免任意增加MySQL每个连接缓冲区

f63332326ff5252dcfffdb8788b6d1ff.png

摘录使用my.cnf配置的Termius。(某些行被删除或模糊以避免危险的滥用)

谁知道这种不良做法在何时何地开始。对于我来说,这是很常见的事情,它是第一次将其SSH到生产服务器中,并发现几乎每个my.cnf变量都增加了。在没有足够理由的情况下增加了这些更改。

一个好的经验法则是,如果您不能提供增加任何这些缓冲区的正当理由,请将其设置为默认值。

这永远不是一个好习惯,尤其是对于这四个my.cnf变量而言。尽管增加某些变量的值可以提高性能,但是增加这四个变量几乎总是会降低MySQL服务器的性能和容量。

有问题的四个缓冲器是 join_buffer_size, sort_buffer_size, read_buffer_size和read_rnd_buffer_size。每个连接分配这四个缓冲区。例如,设置join_buffer_size=1M with max_connections=200 将配置MySQL为每个连接分配额外的1M(1M x 200)。其他三个缓冲区也是如此。同样,所有连接都是按连接的。

在几乎所有情况下,最好都通过删除或注释掉这四个配置行来保留默认值。随着连接随着流量的增加而增加,那些由于缓冲区设置增加而需要的空间超出可用空间的查询可能会触发将这些缓冲区分页到磁盘。这大大降低了数据库服务器的速度,并造成了瓶颈。另请阅读: [使用atop分析Linux服务器性能]

3f9b61b480f7aa775026a6c8bc2feebd.png

首次优化通过后2周,MySQL状态输出。

通常,通过简单地将这些缓冲区恢复为默认值,我已经看到了MySQL性能的提高。让我们快速看一下每个缓冲区。

MySQL的join_buffer_size

该join_buffer_size两个表之间的每个全部联结分配。在MySQL的文档中,join_buffer_size其描述为:“用于普通索引扫描,范围索引扫描和不使用索引从而执行全表扫描的联接的缓冲区的最小大小。”

MySQL的文档继续说:“如果全局大小大于使用它的大多数查询所需要的,则内存分配时间会导致性能大幅下降。” 当联接不能使用索引时mysql配置,联接缓冲区将分配给高速缓存表行。

7cdf02da45039285e0351962500fa91c.png

如果您的数据库遭受许多没有索引执行的联接,则无法通过增加来解决join_buffer_size。问题是“执行没有索引的联接”,因此更快的联接的解决方案是添加索引。

MySQL sort_buffer_size

除非有其他说明,否则也应避免任意增加 sort_buffer_size。每个连接的内存也在这里分配!MySQL的文档警告:“在Linux上,存在256KB和2MB的阈值,其中较大的值可能会显着减慢内存分配,因此您应考虑保持在其中一个值以下。” 避免将sort_buffer_size增加到2M以上,因为这会降低性能,从而降低收益。

MySQL read_buffer_size和 r ead_rnd_buffer_size

你们中有些人仍然在InnoDB上使用MyISAM。在某些情况下有充分的理由。MyISAM基于旧的ISAM存储引擎。如此处所讨论的,它具有许多有用的扩展。

read_buffer_size 通常只适用于MyISAM,不影响InnoDB。在增加此缓冲区之前,请考虑将MySQL表转换为InnoDB存储引擎。 InnoDB是MySQL 5.7和MySQL 8.0的默认存储引擎。InnoDB具有回滚和崩溃恢复功能以保护数据。

read_buffer_size 还用于确定“ 内存” 表的内存块大小 。该read_rnd_buffer_size 变量还主要 MyISAM 用于读取表。另外,考虑使用InnoDB或MariaDB的Aria 存储引擎。在过去的十年中,这些缓冲区的默认值保持不变。

结论

一个好的经验法则是,如果您不能提供增加这些缓冲区的正当理由,请将其设置为默认值。这也以不太严格的方式适用于所有MySQL变量。进行更改时要小心,不要一次全部覆盖整个my.cnf。首先备份所有内容,然后在每次重新启动时进行一次或两次更改,进行24至48小时的测试,然后再进行一次传递。

(编辑:拼字网 - 核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!