2009-08-27 5 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

답변

1
  1. 빠른 방법이 없습니다. InnoDB를 사용한다고 가정하면 테이블 항목을 작성하고 테이블 항목 참조를 제거한 다음 InnoDB가 두 번째 정리 작업을 수행하여 실제로 삭제할 수 있습니다 (삭제는 비용이 많이 듭니다). 그런 다음 데이터베이스에 이러한 결함이 있으면 시간이 지남에 따라 더 많은 사용자를 삭제할 때 거의 결국 성능이 저하됩니다.

  2. 사용자 정보를 저장하는 경우 "활성"이라는 열을 enum (true, false)과 함께 사용자 테이블에 추가하는 것이 가장 좋은 이유는 무엇입니까?

+1

음 ... 집중적으로 테이블을 사용하고 다른 필터 (활성 = true)를 추가하면 '활성'필드를 사용할 수 없어 읽기가 매우 느립니다. 확인. 그래서 나는 그것이 빨리되기를 원하지 않는다고 가정합니다. 내가 테이블 잠금을받지 못하면 충분 해. 이 방법이 있습니까? – dryobates

+0

시작;/* 여기서 일이 일어남 * /; 범하다. InnoDB를 사용하고 있습니다. –

관련 문제