0

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

最常被查询的表是“listings”表,它将包含超过 60 万条记录和 86 列。随着列表的变化,该表也将每 30 分钟更新一次。

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

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

我确实有过维护两个数据库的想法,因为不活动的列表不会被频繁搜索并且需要更少的维护。

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

4

1 回答 1

2

我建议您创建一个存档表。您可以根据要求将流程设置为每 30 分钟或每天运行一次。

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

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

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

  1. 如果新记录不存在,则创建一个当前日期为 的新记录EffDate
  2. 如果存在且所有列都相同,则什么也不做。
  3. 否则更新EndDate存档记录并执行 (1)。
  4. 任何根本没有新记录的存档记录都应该EndDate设置为当前日期。

通常,我每天更新一次此类表格。

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

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

于 2013-02-07T17:30:04.997 回答