2009-08-27 39 views
1

我有8个表:如何使用其他连接表中的记录对记录进行归档?

users: 
    uid 
users_removed: 
    uid 
messages: 
    mid 
    uid FK users (uid) 
messages_removed: 
    mid 
    uid 
comments: 
    cid 
    mid FK messages (mid) 
comments_removed: 
    cid 
    mid 
files: 
    fid 
    mid FK messages (mid) 
files_removed: 
    fid 
    mid 

当我从表中删除记录“用户”我想(从用户在删除之前)将其移动到users_removed表。我还希望将所有相应的消息(以及文件和注释)移至* _removed表。

我使用触发器:

CREATE TRIGGER delete_user BEFORE DELETE ON users 
    FOR EACH ROW BEGIN 
     INSERT IGNORE INTO users_removed 
      SELECT * FROM users WHERE uid = OLD.uid; 
     DELETE FROM messages WHERE OLD.uid in (owner_id, author_id); 
    END 
| 

CREATE TRIGGER delete_message BEFORE DELETE ON messages 
    FOR EACH ROW BEGIN 
     INSERT IGNORE INTO messages_removed 
      SELECT * FROM messages WHERE mid = OLD.mid; 
     DELETE FROM comments WHERE mid = OLD.mid; 
     DELETE FROM files WHERE mid = OLD.mid; 
    END 
| 

CREATE TRIGGER delete_comment BEFORE DELETE ON comments 
    FOR EACH ROW BEGIN 
     INSERT IGNORE INTO comments_removed 
      SELECT * FROM comments WHERE cid = OLD.cid; 
    END 
| 

CREATE TRIGGER delete_file BEFORE DELETE ON files 
    FOR EACH ROW BEGIN 
     INSERT IGNORE INTO files_removed 
      SELECT * FROM files WHERE fid = OLD.fid; 
    END 
| 

但它与> 5万个用户的速度很慢,> 1M消息,评论和文件。

有没有快速的方法来做到这一点?

+1

我可能会将此列作为表格中的一列。 – sshow 2009-08-27 15:18:27

回答

1
  1. 有没有快速的方法来做到这一点。假设你使用的是InnoDB,你必须编写一个表条目,删除一个表条目引用,然后InnoDB做第二次清理运行以实际摆脱它(删除代价昂贵)。然后,随着您随着时间的推移删除更多用户,数据库中的这些漏洞几乎肯定会最终损害性能。

  2. 如果您要保存用户信息,为什么不直接在enum(true,false)的用户表中添加一个名为“active”的用户表?

+1

嗯......我不能使用'active'字段,因为我大量使用该表并添加另一个过滤器(active = true)使其读取速度非常慢。 OK。所以假设我不希望它速度很快。这足以让我不会得到表锁。有没有这方面的一些方法? – dryobates 2009-08-28 08:27:34

+0

开始;/*工作在这里发生* /;承诺。你正在使用InnoDB,对吧? – 2009-08-28 12:17:55

相关问题