MySQL性能规划

时间:2013-02-07 17:18:55

标签: php mysql performance

我正在编写一个系统来搜索房地产列表的MySQL数据库。我很关心性能,并想要了解如何处理这个问题。

最常查询的表是'listing'表,包含超过600k的记录,包含86列。随着列表的更改,此表也将每30分钟更新一次。

几乎所有搜索都将针对状态为“活动”的记录,这些记录将是600k记录中的大约15k。但是,我需要保留内部报告的所有记录。此外,每个查询可能会搜索各种参数(#beds,#baths等),因此缓存可能不可行。

我正在考虑维护第二个表,其中包含标记为“活动”的PK记录。创建列表PK上加入的表的视图。但是,我知道在某些条件下,视图效率非常低。

我确实考虑过维护两个数据库,因为不会频繁搜索非活动列表,并且需要较少的维护。

幸运的是,它尚未投入生产,我有时间进行性能测试。还有一件事,它将托管在一个专用的Linux服务器上,前端用PHP编写。非常感谢所提供的任何见解。

1 个答案:

答案 0 :(得分:2)

我建议您创建一个存档表。您可以设置一个每30分钟或每天运行一次的流程,具体取决于要求。

归档表与原始表加上EffDate和EndDate具有相同的列,它们具有记录处于活动状态的日期/日期时间。

这样的表格可以在任何时间点重新创建历史记录 - 这是有用的,我敢肯定。

您需要使用代码来创建它。基本逻辑是使用归档中的最新版本(EndDate is nullid = id)查找表中的每条记录。然后:

  1. 如果新记录不存在,请创建一个当前日期为EffDate的新记录。
  2. 如果存在且所有列都相同,则不执行任何操作。
  3. 否则更新存档记录中的EndDate并执行(1)。
  4. 任何没有新记录的档案记录都应将EndDate设置为当前日期。
  5. 通常情况下,我每天都会更新一次这样的表格。

    在执行此操作的代码中,我有一个很难看的查询(Excel帮助我构建它),它进行比较并确定哪些记录是“新建”,“已修改”和“删除”。 “已删除”和“已修改”记录将当前EndDates设置为当前日期。然后,“新建”和“修改”记录会将EffDate设置为当前日期,从而获得新记录。

    EndDateEffDate的值可能比规定的值多一个或多少,具体取决于更新的实际工作方式。例如,对于每晚更新,EffDate可能会设置为明天,甚至可能设置为列表生效的日期。