php - 在mysql插入之前临时存储数据

标签 php mysql

我认为您可以打开的 mysql 连接数量是有限制的。有没有一种方法可以暂时存储用户的数据,然后一次性将其插入数据库?或者你还能如何管理 20 万人更新 Facebook 状态? (因为我不知道你可以简单地打开 200k 连接并将信息放入。)

谢谢。

最佳答案

例如,您可以使用队列,其中单个进程获取插入(通过进程间通信或通过套接字,即使 - 在这种情况下 - 您有 200.000 个到队列服务器的连接,或者通过将文件存储到“spool”目录)。

然后进程“获取”队列,在 MySQL 的情况下可能使用扩展语法合并插入,并将它们发送到数据库。

只有当将 INSERT 外包给进程的整个工作比将其发送到 DB 快得多时,这才有用,否则成本和问题(例如,外包后,Web 服务器认为 DB 已更新,但实际上并非如此,而且在收割者​​到达之前的一段(一小段?)时间内也不会超过其好处。

如果收割者进程能够在过载的情况下限制或停止 Web 服务器,那么您可以使整个过程更有弹性:也就是说,MySQL 只能持续每分钟处理 X 次插入,即使有 INSERT DELAYED 等,而入境率还不止于此。然后,在每次迭代中,收割者进程都会注意到队列正在变长。超过给定限制后,该进程可能会设置一个标志,以便新用户收到错误消息并阻止生成进一步的插入。

在入站 > 出站情况下,无论如何都会出现问题,因此至少可以通过这种方式保护现有连接并提供“软故障”模式。

您还可以使用共享内存实现本地缓存:每个 PHP 进程都将插入操作放置在共享内存中(带有锁定!)。如果有超过 X 个元组在等待,或者较旧的元组早于 Y 秒,则所有元组都会合并到发送到 MySQL 的单个 INSERT 中,并且缓存会被清空。这样,整个过程非常轻量级,不使用网络(但使用一点内存),并且 MySQL 上的负载明显减少 - 合并的 INSERT 可以比单独的 INSERT 快 100 倍,并且还可以使用索引禁用/启用技巧。

关于php - 在mysql插入之前临时存储数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11363000/

相关文章:

php - 在我的情况下如何组合多个查询(选择语句)?

php - table_exists() 方法可能无法正常工作

mysql - 在mysql的CONCAT中添加通配符

PHP和MySQL发帖系统

mysql - 服务器重启后按顺序重启Docker容器

python - 无法为 MySQL 加载 Python 绑定(bind) - Trac

php - 使用 CakePHP 3.x 设置 ReactJS 的最佳方法是什么?

php - mysql - 根据另一列的值组合选择一列

php - 在 WooCommerce 中获取并显示所选变体 SKU

PHP Foreach 一个带有返回值的函数并插入到数据库中