php - 将数据从关系数据库反规范化到非关系数据库的最佳实践

标签 php mysql performance mongodb denormalization

我正在运行一个网站,该网站开始超越简单的性能和 Tunning。这是一个以 MySQL 为后端的 PHP 应用程序。 MySQL 已正确调优,代码已优化。

问题是我发现我可以使用某种非规范化来加快速度。

假设您有一个类似于 ebay 或 Amazon 的网站。您的数据库中有产品,其中包含一些相关信息(卖家、购买产品的客户、城市、州等)。那将是关系数据库中的多个表,并且保持这种方式以进行良好的查询是很好的。但是,例如,对于主页,您可能只有一个非规范化文档(例如在 MongoDB 中)。可能是包含最新产品的集合,非规范化,类似于:

products = {
   {
      id:13,
      name:"Some product",
      city:"aCity",
      state:"aState",
      price:"10"
   },
   {
      id:123,
      name:"another product",
      city:"aCity",
      state:"aState",
      price:"10"
   }
}

这样,我可以查询该集合而不是 MySQL 数据库(涉及所有连接),事情会变得非常快。

现在,问题来了。您何时以及如何对这些数据进行非规范化? 例如,我可以决定在插入数据时对数据进行非规范化。

所以,在我的“create-product.php”中(简单地说)。我可以为 mysql 做所有的“插入”,然后我可以保存到 Mongo 集合。

或者,我可以在服务器中运行一个程序。或者做一些 cron 来寻找最新的产品。

所有这些都是可能的。你做什么工作?你的经验是什么?

非常感谢。

最佳答案

从概念上讲,您正在创建某种缓存,并且您预见到填充它会耗费大量时间,因此您希望将其持久化,合理的假设是从持久化缓存加载将会比回到真正的数据库要快。

您的想法有一些变化,缓存 HTML 页面片段或 JSON 字符串,并使用分布式内存缓存 - 不是持久的,而是容错的。

所有缓存解决方案的最大问题是:“我能承受多长时间的陈旧?”。对于某些 24 小时过时的数据来说并不重要。例如:最受欢迎的 10 本书?最新评论,对于那些只需进行一些批量更新的评论。对于更紧急的事情,您可能需要确保有更快速的更新,但您确实希望避免在主流中投入过多的额外处理。例如,给客户一个缓慢的购买体验是一种耻辱,因为他正在等待缓存的更新。在这些情况下,您可能只是将“这里有更新”消息放到队列中,或者确实是“您的条目编号 23 现在已过时”消息,让缓存将其作为闲暇时间进行处理,如果需要自行刷新。

关于php - 将数据从关系数据库反规范化到非关系数据库的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6861719/

相关文章:

java - 静态变量、模式和 Android 性能

performance - 为什么快排的常数因子比堆排序好?

php - 如何诊断此 PHP 段错误?

php - 在表单提交操作后显示隐藏的 DIV

php - SQL行更新+1

php - UTF-8 和 mb_check_encoding

php - 从数据库中检索特定行并显示特定行中的所有数据并使用 php 发送 json

php - 每个月自动加息

php - 像 PHP 中的 Woot-badge

.net - 有什么方法可以更改 .NET JIT 编译器以提高性能而不是编译时间?