2013-02-07 47 views
0

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

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

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

我正在考虑维护第二个包含标记为“active”的记录PK的表。创建列表的PK中加入的表的视图。但是,我知道在某些情况下,Views可能效率很低。

我确实有过维护两个数据库的想法,因为不活动的列表不会经常搜索,而且需要较少的维护。

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

+8

** 86 **列?真?我认为你需要重新考虑你的设计。 – Kermit

+1

我不会创建一个单独的表。 MySQL不应该使用状态作为标准来搜索600K记录。您可以将状态字段编入索引以提高性能并频繁搜索字段。 – Tom

+1

“维护第二个包含标记为'active'的记录的PK的表格”< - 您是否计划手动编写索引?因为只是在该列上使用索引而不是简单而快速。此外,你的大部分专栏是小的还是数字的(如提到的床数)? – Carsten

回答

2

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

存档表将与原始表格plus和EffDate和EndDate具有相同的列,这些列具有记录处于活动状态时的日期/日期时间。

这样的表格可以在任何时间点重新创建历史记录 - 我相信这一点将证明是有用的。

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

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

通常,我有这样的表格每天更新一次。

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

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

+0

我也想到了这一点,但是它不会像频繁上市的商品那样运作。一个房子可能会在市场上(活跃状态)几个月,然后卖家无论出于何种原因将其从市场上(过期)。在法律上,我只能公开展示那些活跃的。 – Raythe

+0

@Raythe。 。 。那仍然有效。档案表不会公开展示。这将是一种重建历史的方法。 –

+0

因此,基本上,当状态变为活动状态时,将其插入到活动列表中并从档案中删除记录。然后在它变为非激活状态时进行相反操作。它是否正确? – Raythe