我每天在 MYSQL 8 中运行一系列任务。实际上,这些任务是从 vb.net 应用程序运行的,该应用程序一次使用 8 个连接与 MYSQL 进行交互。这些任务是一系列复杂的联接、选择和表创建。这些计算机是根据其使用寿命专门指定的。我已经在我的笔记本电脑上运行它们大约 6 个月了。
笔记本电脑规格:16GB RAM DDR3、Intel i5-835OU 处理器 1.7 GHZ、4 核、SSD 硬盘 - 完成任务的时间 7981 秒 - 任务期间的平均使用率 75% CPU、43% 内存、100% 磁盘
就在最近,我购买了一台便宜的迷你电脑
Mini PC 1 规格:16GB RAM DDR4、N100 处理器 3.4 GHZ、4 核、SSD 硬盘 - 完成任务的时间 5532 秒 - 任务期间的平均使用率 100% CPU、50% 内存、81% 磁盘
我对速度的升级感到非常惊喜,所以我决定购买他们升级后的迷你电脑。
Mini PC 2 规格:32GB RAM DDR5、Ryzen_7 处理器 4.75 GHZ、8 核、SSD 硬盘 - 完成任务的时间 9178 秒 - 任务期间的平均使用率 14% CPU、19% 内存、46% 磁盘
正如您所看到的,升级后的电脑速度大幅下降。而且升级后的电脑似乎并没有真正工作得那么努力。
那么我的问题是:是否有一些设置/方法可以让我为 MySQL 本身投入更多的精力?我的计算机似乎拥有加速这些任务/查询的所有资源,但它没有利用它们。购买这台电脑的全部目的是为了更快地运行这些任务。有没有办法将所有/大部分计算机资源投入 MYSQL 以提高速度?
谢谢。
我最好的答案不是系统优化而是查询优化。我发现通过重组我的查询,我可以让它们利用更多的内存和更少的硬盘。这利用了PC2的速度升级。最终PC2现在在649秒内完成了查询;比 PC1 完成它们的速度大约快 9 倍。在查询期间,PC2 现在运行 100% CPU、77% 内存和 21% 磁盘。
最初,我发现创建一系列临时表可以在我的笔记本电脑上实现最佳性能。然后,我将从这些临时表中选择我想要的数据。但是,一旦 PC2 有了更多的可用内存,通过连接直接从主表中提取数据的速度就大大提高了。
原始示例 - 我的结构如下所示:
在我的笔记本电脑和 PC1 上,这是 RAM 和 ROM 使用的正确平衡。
新示例 - 将我的结构更改为如下所示:
对于 PC2,当有足够的 RAM 来完成这项工作时,没有充分的理由将临时表写入硬盘驱动器。
因此,我对所学到的内容的总结是:当 RAM 不足时,将表分成较小的临时表会非常有帮助。但如果你有足够的内存来避免这些额外的步骤,那么删除它们会更快。但这是一种平衡行为。有时您需要更多中间步骤,而有时最好直接进行。
考虑 PC1 my.ini [mysqld] 部分的建议
还有更多的性能调整机会。
请访问我们的网站下载我们的免费实用程序脚本 findfragtables.sql 脚本,以减少在此空间中过度配置的表中的 data_free (free_space)。优化表 tbl_name;对于已识别的表。
考虑 PC2 my.ini [mysqld] 部分的建议
还有更多提高绩效的机会。