mysql表及其删除策略
我在一个社交网络上工作,就像Facebook的一个子集。我认为这意味着应用程序的读重于写重(即选择多于插入、更新或删除) 我计划使用MyISAM为数据库使用MySQL。数据库中的每个表将包含以下三个字段:mysql表及其删除策略,mysql,myisam,sql-delete,overhead,Mysql,Myisam,Sql Delete,Overhead,我在一个社交网络上工作,就像Facebook的一个子集。我认为这意味着应用程序的读重于写重(即选择多于插入、更新或删除) 我计划使用MyISAM为数据库使用MySQL。数据库中的每个表将包含以下三个字段: CREATED-包含记录创建时间的日期字段 UPDATED-包含记录修改时间的日期字段 ROWSTATUS-包含单个字符标志的字符(1)字段,用于显示记录是活动的、非活动的还是已删除的(分别使用值“a”、“I和D) 通过一个PHP包装类,我们确保所有SELECT查询都包括ROWSTATUS
-包含记录创建时间的日期字段CREATED
-包含记录修改时间的日期字段UPDATED
-包含单个字符标志的字符(1)字段,用于显示记录是活动的、非活动的还是已删除的(分别使用值“a”、“I和ROWSTATUS
)D
D
,以显示它已被删除(即软删除)
我们有一个SQL过程,它会在10天后物理删除删除的数据
然而,我正在经历,它认为由于锁定开销,没有必要进行物理删除。相反,作者建议使用此方案:
SELECT e.eventid,e.title
FROM events e
WHERE NOT EXISTS
(SELECT * FROM event_deletes ed WHERE ed.eventid = e.eventid);
我想知道我的方案与这个提议的机制相比如何,哪一个更好?我自己无法找到任何明确的答案。与那篇文章相比,我在这里看到的唯一问题是,您只处理删除调用的锁 您应该知道,UPDATE和DELETE语句总是需要对MyISAM表发出独占锁。 这就是本文建议使用INSERT而不是UPDATE rowstatus的原因。你应该照文章说的去做。创建一个专用表来存储已删除的ID,并在selects上使用建议的联接来检索未删除的记录。这样,在最终用户的删除操作中,您只需插入到表中,而不会导致表上的更新锁定。如果您向这两个表都添加了正确的键,那么连接将只在索引上完成,而在SELECT上则会更快
如果存储更新时间,也会带来开销。你应该放弃这个想法,因为它没有用,你也不会用它来告诉记录何时被更新。正如@Pentium10所说,你的计划没有本质上的错误。这实际上是一个相当标准的方法 问题在于,如果使用MyISAM,那么在查询运行时,更新将导致整个表被锁定。这会带来瓶颈,因为一次只能更新或删除一条记录
除非您有理由使用MyISAM,否则我建议您切换到InnoDB作为您的数据库引擎。InnoDB使用行级锁定,因此您的更新查询不会阻止其他更新。它还有其他一些不错的特性,例如支持事务和引用完整性约束。请恕我直言。自从那篇文章发表以来,近7年来发生了很多变化。你计划使用MyISAM而不是InnoDB有什么原因吗?@agentNuntrum。。。我们已经在使用MyISAM,我正在考虑迁移到InnoDB。我只是想调查一下它的优点和缺点。MyISAM唯一想到的“优点”就是它的全文搜索。如果你不需要的话,我会选择InnoDB。即使您确实需要它,您也最好在FTS中使用类似Sphinx的内容。但是我们有VARCHAR列或TEXT type列,并执行查询[colname,如“%USER\u SEARCH\u QUERY%”。推荐的做法是什么?是的。。我认为这是有道理的。。我错了。我们应该选择InnoDB来充分利用我们的数据库设计。指参照完整性。我们根本不用外键。我们试图通过我们的代码来管理所有的事情。谢谢你的回答。基本上我错了。参考更新的专栏。实际上我们也用它来寻找一些信息;特别是在报告模块中