mysql表和删除策略

时间:2010-12-16 06:16:38

标签: mysql myisam sql-delete overhead

我正在开发一个社交网络,就像Facebook的一个子集。我认为这意味着应用程序将比读取文件更重读(即比INSERTS,UPDATES或DELETES更多SELECTS)

我打算使用MyISAM将MySQL用于数据库。数据库中的每个表将包含以下三个字段:

  • CREATED - 包含创建记录的时间的日期字段
  • UPDATED - 包含修改记录时间的日期字段
  • ROWSTATUS - 包含单个字符标记的CHAR(1)字段,用于显示记录是活动,非活动还是已删除(使用值'A',I和{{1}分别)。

通过PHP包装器类,我们确保所有SELECT查询都包含ROWSTATUS,UPDATE查询也更新UPDATED列,INSERT查询更新CREATED列。

我打算不删除任何记录,而是选择将记录ROWSTATUS字段更新为D以显示它已删除(即软删除)。

我们有一个SQL程序,可以在10天后以物理方式删除已删除的数据。

但是,我正在经历this article,它认为由于锁定开销,不需要物理删除。相反,作者建议使用这个方案:

D

我想知道我的方案与这个提议的机制相比,哪个更好?我无法自己找到任何确定的答案。

2 个答案:

答案 0 :(得分:2)

正如@ Pentium10所说,你的计划没有任何本质上的错误。它实际上是一种相当标准的方法。

问题只是如果你正在使用MyISAM,你的UPDATE将导致整个表在查询运行时锁定。这引入了一个瓶颈,因为您一次只能更新或删除一条记录。

除非您有使用MyISAM的理由,否则我建议您切换到InnoDB作为您的数据库引擎。 InnoDB使用行级锁定,因此您的UPDATE查询不会阻止其他UPDATE。它还有一些其他很好的功能,例如支持事务和参照完整性约束。

答案 1 :(得分:0)

我在这里看到的唯一问题是,与该文章相比,您只处理DELETE调用的锁。

您应该知道 UPDATE和DELETE语句总是需要在MyISAM表上发出独占锁。

这就是为什么本文建议使用INSERT而不是UPDATE rowstatus。你应该像文章所说的那样去做。创建一个专用表来存储已删除的ID,并使用选择的推荐连接来检索未删除的记录。这样在最终用户的删除操作上,您只需插入表中,就不会对表造成UPDATE锁定。如果向两个表中添加正确的键,则仅在索引上进行连接,在SELECT上快速连接。

如果存储更新时间,也会引入开销。你应该放弃这个想法,没有用,你不会用来告诉记录何时更新。

相关问题