mysql - 使用缓冲区大小和持久连接配置优化 mysql (mariadb) 中数据库性能的最佳方法
问题描述
我有;
- PHP 7.3 中使用 CodeIgniter 框架的 CRUD 重负载应用程序。
- 只有 2 个用户访问应用程序。
- 数据库是 mariadb 10.2,有 10 个表。通常,存储的 INT 和引擎默认是 InnoDB,但在表中,我存储了一个“mediumtext”列。
- 由 cronjobs 管理的应用程序(每分钟 10 个不同的作业)
- 一个工作的平均收益是来自 DB 的 100-200 CRUD。(总共 ~ 1k-2k CRUD 在一分钟内使用 10 个表)
经测试;
MySQL 中的持久连接我遇到了最大连接超出的问题,所以我注意到如果你没有在 database.php 中将 pconnect 设置为 true,Code Igniter 不会关闭连接。因此,简化一下,如果您将其设置为 true,它会使用允许持久连接。所以,我想解决这个问题,我找到了一个需要将其设置为false的解决方案,它会自动关闭所有连接。我更改了配置以禁止持久连接。
在我更新持久连接后禁用。我的应用程序开始正常运行,1 小时后,由于下面显示的几个错误,它再次崩溃,我通过在 mariadb 的 my.cnf 中将max_allow_package设置为最大值来修复这些错误。
警告 --> 发送 QUERY 数据包时出错。PID=2434 查询错误:MySQL 服务器已消失
- 我注意到数据库需要调整。数据库大小为 1GB+。我每分钟都有很多 CRUD 作业。因此,我将缓冲区大小更改为 1GB,将 innodb 引擎池大小更改为 %25。我习惯了MySQL Tuner,并用它来计算这些变量。
最后,我仍然收到查询包错误。
数据包乱序。预期 0 收到 1. 数据包大小=23
我的服务器有 8GB 内存(使用了 %25),4 核 x 2ghz(使用了 %10)我现在无法确定哪种配置是最佳选择。我无法增加 RAM,也 %25 使用了 ram,因为密钥缓冲区大小为 1GB,它可以充分利用 ram 即时作业。
我可以吗;
- 修复数据库错误,
- 增加平均完成的 CRUD 过程
解决方案
8GB 内存 --> innodb_buffer_pool_size = 5G。
200 qpm --> 没问题。(200qps可能是一个挑战)。
10张桌子;2 个用户 --> 不是问题。
持久连接 --> 褶边;不需要。
key_buffer_size = 1G
? --> 为什么?你不应该使用 MyISAM。更改为 30M。
max_allow_package
--> 那是什么?也许是一个错字max_allow_packet
?不要将其设置为超过 RAM 的 1%。
Packets out of order
--> 听起来像是网络故障,而不是数据库错误。
MEDIUMINT
--> 比小于一个字节,因此在适用时INT
它是一个小好处。
推荐阅读
- python - 将数组保存到多列而不是附加为一大列
- android - 为什么这个节拍器应用程序会崩溃?(安卓)
- python - 如何在 Python 和另一种语言之间共享内存映射文件?
- oauth-2.0 - 基本授权Angular 5获取预检响应具有无效的HTTP状态代码401
- docker - 使用 docker stack 时挂载 tmpfs
- c - 从 n 叉树中删除一个完整的分支
- php - 无法让 phpMyAdmin 在 Mac 上使用 Yii2 和 XAMPP
- javascript - 这个简单的 mergeSort 代码给出了错误的答案。有人可以找到错误吗?
- java - HtmlUnit 和按钮
- c# - Zip 文件导致 HTTP 错误 502.3 Asp Core 2.0