2010-05-07 3 views
7

캐시 키의 일부로 원본 테이블의 마지막 업데이트 시간을 사용하여 memcached에 데이터베이스 쿼리의 처리 된 결과를 저장하는 데 성공했습니다. MyISAM 테이블의 경우 마지막 변경 시간은 SHOW TABLE STATUS입니다. 불행히도, InnoDB 테이블에서는 보통 NULL이다.InnoDB 테이블이 마지막으로 변경된 시점을 어떻게 알 수 있습니까?

MySQL 4.1에서 InnoDB의 SHOW TABLE STATUS 행에 대한 ctime은 보통 실제 최종 업데이트 시간 이었지만 MySQL 5.1에서는 그렇지 않습니다.

테이블에 DATETIME 필드가 있지만 행이 수정 된 경우에만 표시됩니다. 더 이상 존재하지 않는 행의 삭제 시간을 표시 할 수 없습니다! 그래서, 나는 정말로 MAX(update_time)을 사용할 수 없다.

정말 까다로운 부분이 있습니다. 나는 내가 읽는 많은 복제본을 가지고있다. 변경 사항이 실제로 적용되었을 때 의존하지 않는 테이블의 상태를 파악할 수 있습니까?

잠시 동안 작업 한 결과 내 결론은 내가 원하는만큼 저렴하게이 정보를 얻을 수 없다는 것입니다. 나는 아마도 테이블이 바뀔 것으로 예상 할 때까지 데이터를 캐싱 할 것입니다 (하루에 한 번 업데이트됩니다). 그리고 쿼리 캐시가 가능한 한 도움을 줄 수있게하십시오.

답변

8

이것은 MySQL bug 14374, 15438 및 그 밑에있는 InnoDB bug 2681입니다.

두 가지 제안 사항이 있습니다 (MySQL 패치 이외).

  1. 파일 당 하나의 테이블 (innodb_file_per_table)을 사용하는 경우 기본 파일을 stat합니다. 이 작업을 수행하려면 MySQL 함수/확장을 작성할 수 있습니다. 데이터베이스 캐싱으로 인해 약간 지연 될 수 있습니다.
  2. after update, delete 및 insert 트리거를 사용하여 관련 메타 테이블의 마지막 업데이트 시간으로 메타 데이터 테이블을 유지할 수 있습니다.

저는 개인적으로 훨씬 더 이식성이 뛰어나고 구현 세부 정보 (예 : innodb_file_per_table)에 의존하지 않으므로 두 번째를 제안합니다.

+2

이 InnoDB의 트리거 대한 2.nd 경로를가는 경우 유의 사항 : "참고 현재 계단식 외래 키 동작은 트리거를 활성화하지 않습니다." ([13.2.2.5. FOREIGN KEY Constraints] (http://dev.mysql.com/doc/refman/5.6/en/innodb-foreign-key-constraints.html)에서) –

11

당신은, 데이터베이스가 변경되었을 때 정말 관심이 아니에요하지만 하나의 데이터베이스 표는 희망이 도움이

MySQL의 CHECKSUM TABLE으로 보일 것입니다 변경되었습니다 어떠했는지 여부를 알고 싶은 경우.

+0

엄청나게 필요한 것! – astgtciv

-1

나는 테이블에 다른 열을 추가 제안하고,이 같은 MySQL이 테이블이 마지막으로 수정 된 추적 할 것 :

ADD COLUMN `last_update` TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL 
+0

이것은 특정 행이 갱신 된 경우에만 표시됩니다. "SELECT MAX (last_update) FROM table"을 수행 할 수있는 동안 가장 많은 수정 된 시간을 얻기 위해 많은 수의 행이있는 테이블에 엄청난 오버 헤드가 추가 될 수 있습니다 –

관련 문제