【发布时间】:2011-05-26 08:56:02
【问题描述】:
我正在开发一个社交网络,比如 Facebook 的一个子集。我认为这意味着应用程序的读取量将大于写入量(即 SELECTS 比 INSERTS、UPDATES 或 DELETES 多)
我打算将 MySQL 用于数据库,使用 MyISAM。数据库中的每个表都会包含以下三个字段:
-
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);
我想知道我的方案与这个提议的机制相比如何,哪个更好?我自己无法得出任何明确的答案。
【问题讨论】:
-
对这个建议持保留态度。自那篇文章发表以来的近 7 年里发生了很多变化。
-
您计划使用 MyISAM 而不是 InnoDB 有什么原因吗?
-
@AgentConundrum ...我们已经在使用 MyISAM,我正在考虑迁移到 InnoDB。只想调查利弊
-
老实说,MyISAM 唯一想到的“专业人士”就是它的全文搜索。如果您不需要它,那么我会选择 InnoDB。即使您确实需要它,您最好还是使用 Sphinx 之类的东西作为您的 FTS。
-
但是我们有列 VARCHAR 或 TEXT 类型并且我们执行查询 [colname like '%USER_SEARCH_QUERY%']。推荐的做法是什么?
标签: mysql myisam sql-delete overhead