我在社交网络上工作,例如Facebook的子集。我认为这意味着该应用程序将比写入更重(即选择,更新或删除)更重(即选择更多的选择)

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

  • CREATED - 日期字段包含创建记录的时间
  • UPDATED - 一个日期字段,包含记录的时间
  • ROWSTATUS - 一个包含单个字符标志的char(1)字段,以显示记录是否处于活动状态,无效或已删除(使用'a','',' I, , 和 D, , 分别)。

通过PHP包装器类,我们确保所有选择的查询都包括RowStatus,并且更新查询还更新更新的列和插入查询更新创建列。

我打算不实际删除任何记录,选择将记录Rowstatus字段更新为 D 要显示它已删除(即软删除)。

我们有一个SQL过程,该过程在10天后物理上删除了已删除的数据。

但是,我正在经历 本文, ,认为由于锁定开销而无需进行身体删除。相反,作者建议使用此方案:

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

我想知道我的计划如何与这种提出的机制进行比较,哪一种更好?我无法独自找到任何确定的答案。

有帮助吗?

解决方案

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

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

除非您有使用Myisam的理由,否则建议您将InnoDB切换为数据库引擎。 InnoDB使用行级锁定,因此您的更新查询不会阻止其他更新。它还具有其他一些不错的功能,例如对交易和参考完整性约束的支持。

其他提示

与该文章相比,我在这里看到的唯一问题是,您仅处理删除呼叫的锁。

你应该知道 更新和删除语句始终需要在Myisam表上发布独家锁定。

这就是为什么本文建议使用插入而不是更新Rowstatus的原因。您应该像文章所说的那样走。创建一个专用表来存储已删除的ID,并在Selects上使用推荐的JOIN来检索未删除的记录。这样,在最终用户的删除操作中,您将只插入表格,并且不会导致表上的更新锁定。如果您在两个表中添加了适当的键,则连接只能在索引上完成,SI将在SELECT上快速进行。

如果您存储更新的时间,您还将介绍开销。您应该放弃这个想法,没有用,也不会用来判断何时更新记录。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top