我正在运行一个网站,它开始超越简单的性能和调整。这是一个以MySQL作为后台的PHP应用程序。对MySQL进行了适当的调整,并对代码进行了优化。
问题是,我看到我可以使用某种反规范化来加快速度。
假设你有一个类似于ebay或Amazon的网站。您的数据库中有产品和一些相关信息(卖家、购买产品的客户、城市、州等)。这将是关系DataBase中的多个表,保持这种方式以进行良好的查询是很好的。但是,例如,对于主页,您可以有一个单独的非规范化文档(例如在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执行所有的"insert into“操作,之后我可以对Mongo集合进行保存。
或者,我可以在服务器上运行一个程序。或者制作一些cron来寻找最新的产品。
所有这些都是可能的。你的工作是什么?你的经验是什么?
非常感谢。
发布于 2011-07-29 00:07:48
从概念上讲,您正在创建某种类型的缓存,并且您看到填充它将是非常耗时的,因此您希望将其持久化,并合理地假设从持久化缓存加载将比返回到真正的DB更快。
您的想法有一些变化,缓存HTML页面片段或JSON字符串,并使用分布式内存缓存-不是持久性的,但具有容错能力。
所有缓存解决方案的一个大问题是:“我能承受多大的过时?”对于某些数据来说,24小时过期并不重要。例如:最受欢迎的十本书?最新的评论,对于那些只需要一些批量更新就可以了。对于更紧急的东西,你可能需要确保有一个更快的更新,但你真的想避免在主流中放太多额外的处理。例如,因为客户正在等待缓存的更新,而给客户一个缓慢的购买体验,这将是一种遗憾。在这些情况下,您可能只是在队列上丢弃一条"Here's an update“消息,或者实际上是一条"your entry nunber 23 is now stale”消息,让缓存在空闲时拾取该消息,并在需要时进行自我刷新。
https://stackoverflow.com/questions/6861719
复制相似问题