2009-10-08 3 views
0

매우 자주 데이터가 삽입 된 MySQL (버전 5.0) 데이터베이스에 대형 테이블 (수백만 행)이 있습니다.MySQL의 동일한 데이터베이스에있는 테이블의 일부를 복제하십시오.

최근 데이터 (예 : 최신 10000 행) 만 필요로하는 데이터베이스에 대해 수행되는 select 문이 적기 때문에 주 테이블에서 데이터 사본을 보관할 수있는 테이블을 만드는 방법이 있습니까? 주 테이블에 많은 영향을 미치지 않으면 서 새 행이 주 테이블에 추가 될 때마다 새 행을 동적으로 추가합니다 (이전 데이터를 주기적으로 삭제하여 문제가 너무 많지 않음).

가능하면 두 번째 테이블의 행을 약간 다르게 인덱싱하고 싶습니다.

답변

2

triggers을 사용해야하는 것 같습니다.

  • 가 삽입 한 후 각 행에 대해 당신이 작은 테이블
  • 에서 가장 오래된 행을 작은 테이블에 새 행을 복사하고 삭제해야합니다 :

    당신은 큰 테이블에 세 개의 트리거가 필요합니다

  • AFTER UPTERATE 후에 각 행에 대해 해당 행이 더 작은 테이블에 있는지 확인해야합니다. 일치하는 행이있는 경우 해당 행을 확인해야합니다.
  • 삭제 후 각 행에 대해 행이 작은 테이블에 있고,있는 경우 행을 제거하십시오. 예를 들어

:

DELIMITER // 
CREATE TRIGGER after_insert AFTER INSERT ON big_table 
FOR EACH ROW 
BEGIN 
    DECLARE small_table_rows INTEGER; 
    INSERT INTO small_table (field1, field2) VALUES (NEW.field1, NEW.field2); 
    SELECT COUNT(*) INTO small_table_rows FROM small_table; 
    IF small_table_rows > 10000 THEN 
     DELETE FROM small_table ORDER BY id ASC LIMIT 1; 
    END IF 
END;// 
DELIMITER ; 

DELIMITER // 
CREATE TRIGGER after_update AFTER UPDATE ON big_table 
FOR EACH ROW 
BEGIN 
    UPDATE small_table 
    SET field1 = NEW.field1, field2 = NEW.field2 
    WHERE small_table.id = NEW.id; 
END;// 
DELIMITER ; 

DELIMITER // 
CREATE TRIGGER after_delete AFTER DELETE ON big_table 
FOR EACH ROW 
BEGIN 
    DELETE FROM small_table WHERE small_table.id = OLD.id; 
END;// 
DELIMITER ; 

테이블의 열이 많은 경우 트리거가 다루기 얻을 수 있지만 그것은 상당히 간단합니다. MyISAM 대 InnoDB의 성능 특성을 고려해 볼 수 있습니다. InnoDB는 실행중인 쿼리의 종류에 따라 전반적인 성능을 향상시킬 수 있습니다.

보기를 사용하고 싶지 않습니다. MySQL의 뷰는 구체화되지 않으므로 일반적으로 성능 이점 (원하는대로 들리는)을 얻지 못하고 뷰가있는 테이블과 뷰를 다르게 인덱싱 할 수 없습니다 기반.

+0

감사를 사용할 수 있습니다. 트리거가 가장 좋은 방법 인 것처럼 보입니다. – amardilo

1

당신은 부모가 업데이트되는 경우 업데이트 얻을 것이다 VIEWS를 사용하거나 도움 스리 쿠마와 인두 셔 마루스에 대한 TRIGGERS

관련 문제