mysql表和删除策略

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

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

> CREATED – 包含创建记录的时间的日期字段
> UPDATED – 包含记录修改时间的日期字段
> ROWSTATUS – 包含单个字符标志的CHAR(1)字段,用于显示记录是活动,非活动还是已删除(分别使用值“A”,“I”和“D”).

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

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

我们有一个SQL过程,它在10天后物理删除已删除的数据.

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

SELECT e.eventid,e.title
    FROM events e
   WHERE NOT EXISTS
    (SELECT * FROM event_deletes ed WHERE ed.eventid = e.eventid);

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

最佳答案 正如@ Pentium10所说,你的计划没有任何本质上的错误.这实际上是一种相当标准的方法.

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

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

点赞