我正在编写一个系统来搜索房地产列表的MySQL数据库。我很关心性能,并想要了解如何处理这个问题。
最常查询的表是'listing'表,包含超过600k的记录,包含86列。随着列表的更改,此表也将每30分钟更新一次。
几乎所有搜索都将针对状态为“活动”的记录,这些记录将是600k记录中的大约15k。但是,我需要保留内部报告的所有记录。此外,每个查询可能会搜索各种参数(#beds,#baths等),因此缓存可能不可行。
我正在考虑维护第二个表,其中包含标记为“活动”的PK记录。创建列表PK上加入的表的视图。但是,我知道在某些条件下,视图效率非常低。
我确实考虑过维护两个数据库,因为不会频繁搜索非活动列表,并且需要较少的维护。
幸运的是,它尚未投入生产,我有时间进行性能测试。还有一件事,它将托管在一个专用的Linux服务器上,前端用PHP编写。非常感谢所提供的任何见解。
答案 0 :(得分:2)
我建议您创建一个存档表。您可以设置一个每30分钟或每天运行一次的流程,具体取决于要求。
归档表与原始表加上EffDate和EndDate具有相同的列,它们具有记录处于活动状态的日期/日期时间。
这样的表格可以在任何时间点重新创建历史记录 - 这是有用的,我敢肯定。
您需要使用代码来创建它。基本逻辑是使用归档中的最新版本(EndDate is null
和id = id
)查找表中的每条记录。然后:
EffDate
的新记录。EndDate
并执行(1)。EndDate
设置为当前日期。通常情况下,我每天都会更新一次这样的表格。
在执行此操作的代码中,我有一个很难看的查询(Excel帮助我构建它),它进行比较并确定哪些记录是“新建”,“已修改”和“删除”。 “已删除”和“已修改”记录将当前EndDates
设置为当前日期。然后,“新建”和“修改”记录会将EffDate
设置为当前日期,从而获得新记录。
EndDate
和EffDate
的值可能比规定的值多一个或多少,具体取决于更新的实际工作方式。例如,对于每晚更新,EffDate
可能会设置为明天,甚至可能设置为列表生效的日期。