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

我正在运行一个网站,该网站开始超越简单的性能和 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 现在已过时”消息,让缓存将其作为闲暇时间进行处理,如果需要自行刷新。

https://stackoverflow.com/questions/6861719/

相关文章:

mongodb - mongodb中OR+Sort查询的复合索引

mongodb - 在 MongoDB 中使用 directoryperdb 的好处

mongodb安装 - 要求?

python - Python中的跟踪系统和实时统计分析

python - 如何使用 MongoKit 对远程数据库主机进行身份验证?

mongodb - 您将如何使用文档存储(例如 CouchDB、Redis、MongoDB、Riak

javascript - 查找和更新嵌套级别

python - Pymongo 断言错误 : ids don't match

mongodb - 如何使用 map/reduce 处理 10000 多个唯一键以在 MongoDB

mongodb - 命令以非零退出代码 : Error executing in Docker Co