Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql表及其删除策略_Mysql_Myisam_Sql Delete_Overhead - Fatal编程技术网

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

我在一个社交网络上工作,就像Facebook的一个子集。我认为这意味着应用程序的读重于写重(即选择多于插入、更新或删除)

我计划使用MyISAM为数据库使用MySQL。数据库中的每个表将包含以下三个字段:

  • CREATED
    -包含记录创建时间的日期字段
  • UPDATED
    -包含记录修改时间的日期字段
  • ROWSTATUS
    -包含单个字符标志的字符(1)字段,用于显示记录是活动的、非活动的还是已删除的(分别使用值“a”、“I和
    D
通过一个PHP包装类,我们确保所有SELECT查询都包括ROWSTATUS,UPDATE查询也更新更新的列,INSERT查询更新创建的列

我计划不实际删除任何记录,而是选择将记录行状态字段更新为
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来充分利用我们的数据库设计。指参照完整性。我们根本不用外键。我们试图通过我们的代码来管理所有的事情。谢谢你的回答。基本上我错了。参考更新的专栏。实际上我们也用它来寻找一些信息;特别是在报告模块中