MySQL表和删除策略
-
10-10-2019 - |
题
我在社交网络上工作,例如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上快速进行。
如果您存储更新的时间,您还将介绍开销。您应该放弃这个想法,没有用,也不会用来判断何时更新记录。