缓存数据以备用 mysql 查询

Caching data to spare mysql queries

我有一个 PHP 应用程序,它同时执行了一百次,而且非常频繁。 (它是一个拥有 250k+ 用户的电报反垃圾邮件机器人) 该脚本本身进行各种数据库调用(代码更新、计数器等),但它每次也会从数据库中加载或多或少的 'static' 数据,例如正则表达式或 json 配置文件。 我的脚本也在做图像处理,所以服务器的 CPU 和 RAM 有时会承受压力。

几天前我 运行 遇到了一个问题,apache2 OOM-Killer 由于可用内存不足而终止了 mysql 服务器进程。 mysql 服务器没有自动重启,导致我的脚本中断了几个小时。

我已经做了一些代码优化,使我的服务器能够呼吸,但我现在正在寻找的是有一些缓存方法来存储脚本执行之间的数据,并有可能根据时间间隔更新它们. 首先,我想到了可以序列化数据的平面文件,但我想知道这对性能来说是否是个好主意。

就我而言,使用缓存数据比 mysql 查询有好处吗? 关于访问速度、执行速度,pro/con 是多少? 最后,我应该实施什么缓存方法? 我知道最简单的解决方案是升级我的服务器容量,我打算尽快这样做。

服务器是 运行 Debian 11,PHP 8.0 谢谢。

如果您可以使用 NoSQL 来提供这些查询,它会大大加快速度。

现在,如果这是不行的,您可以老一套,将“静态”数据保留在文件系统中。

然后您可以创建自己的计时器,例如每 20 分钟运行一次以更新文件。

当您询问有关访问速度、执行速度的信息时,答案始终是“取决于”,但根据您所说,访问不断查询数据库以获取相同信息的文件系统会更好。 ..

复杂性、一致性等导致我建议不要使用缓存层。相反,让我们在其他优化方面多做一些工作。

OOM 表示调整不当。向我们展示您在 my.cnf 中拥有的东西。你有多少内存?图像处理需要多少 RAM? (PHP 的图像* 库有点像内存消耗。)我们需要先了解 MySQL 可以拥有多少 RAM。

如需调整,请提供GLOBAL STATUSVARIABLES。参见 http://mysql.rjweb.org/doc.php/mysql_analysis

link 还展示了如何收集慢日志。在其中我们应该能够找到“最差”的查询并致力于优化它们。对于“一百次并发”,再快的查询也需要进一步优化。提供 'worst' 查询时,请提供 SHOW CREATE TABLE.

另一种技术是减少 Apache 允许运行 的children 数量。 Apache 将排队其他人。 “数百”对于 Apache 或 MySQL 来说太多了;最好等着开始其中的一些,而不是让“数百人”互相绊倒。