我正在编写一个系统来搜索房地产列表的 MySQL 数据库。我担心性能问题,希望获得一些有关如何处理此问题的意见。
最常查询的表是“listings”表,将包含超过 600k 条记录和 86 列。随着列表的变化,该表还将每 30 分钟更新一次。
几乎每次搜索都会针对状态为“事件”的记录,这大约是 60 万条记录中的 1.5 万条。但是,我需要保留内部报告的所有记录。此外,每个查询可能会搜索各种参数(#beds、#baths 等),因此缓存可能不可行。
我正在考虑维护第二个表,其中包含标记为“事件”的记录的 PK。创建在列表的 PK 上连接的表的 View 。但是,我知道在某些条件下, View 的效率可能非常低。
我确实想过维护两个数据库,因为不活跃的列表不会被频繁搜索,并且需要较少的维护。
幸运的是它还没有投入生产,我有时间进行性能测试。另一件事是,这将托管在一个专用的 Linux 服务器上,前端用 PHP 编写。任何提供的见解都将受到高度赞赏。
最佳答案
我建议您创建一个归档表。您可以根据要求将流程设置为每 30 分钟运行一次或每天运行一次。
存档表将具有与原始表相同的列以及 EffDate 和 EndDate,其中包含记录处于事件状态时的日期/日期时间。
这样的表将使得在任何时间点重新创建历史记录成为可能——我确信这将被证明是有用的。
您将需要代码来创建它。基本逻辑是使用存档中的最新版本查找表中的每条记录(EndDate 为 null
且 id = id
)。然后:
- 如果不存在新记录,则创建一条新记录,并将当前日期设置为
EffDate
。 - 如果存在且所有列都相同,则不执行任何操作。
- 否则更新存档记录上的
EndDate
并执行 (1)。 - 任何根本没有新记录的存档记录都应将
EndDate
设置为当前日期。
通常,我每天更新一次此类表格。
在执行此操作的代码中,我有一个丑陋的大查询(Excel 帮助我构建它),它进行比较并确定哪些记录是"new"、“已修改”和“已删除”。 “已删除”和“已修改”记录的当前 EndDates
设置为当前日期。然后,“新建”和“修改”记录将获得一条新记录,其 EffDate
设置为当前日期。
EndDate
和 EffDate
的值可能比指定的值多或少,具体取决于更新的实际工作方式。例如,对于夜间更新,EffDate
可能会设置为明天,甚至设置为列表生效的日期。
关于php - MySQL 性能规划,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14757062/