2010-12-16 6 views
4

나는 페이스 북의 서브 세트와 같은 소셜 네트워크에서 일하고있다. 이는 애플리케이션이 쓰기가 무거운 것보다 더 무겁게 읽는다는 것을 의미한다고 생각합니다. (삽입, 업데이트 또는 삭제보다 더 많은 선택)mysql 테이블과 삭제 전략

MyISAM을 사용하여 데이터베이스에 MySQL을 사용할 계획입니다. 데이터베이스의 각 테이블에는 다음과 같은 세 개의 필드가 포함됩니다 : 레코드가

  • ROWSTATUS 수정 된 시간을 포함하는 날짜 필드 - - 레코드가
  • UPDATED을 생성 된 시간을 포함하는 날짜 필드

    • CREATED을 - 레코드가 활성, 비활성 또는 삭제됨 (값 'A', ID을 각각 사용하여)인지 나타내는 단일 문자 플래그를 포함하는 CHAR (1) 필드.

    PHP 랩퍼 클래스를 통해 모든 SELECT 쿼리에 ROWSTATUS가 포함되고 UPDATE 쿼리가 UPDATED 열을 업데이트하고 INSERT 쿼리가 CREATED 열을 업데이트하도록합니다.

    실제로 레코드를 삭제하지 말고 레코드 ROWSTATUS 필드를 D으로 업데이트하여 삭제되었음을 나타냅니다 (즉, 소프트 삭제).

    10 일 후에 삭제 된 데이터를 실제로 삭제하는 SQL 프로 시저가 있습니다.

    그러나 나는 오버 헤드를 잠그기 때문에 물리적으로 삭제할 필요가 없다고 주장하는 this article을 사용하고있었습니다. 오히려 저자는이 방식을 사용하여 제안 : 내 계획이 제안 된 메커니즘을 비교하는 방법

    SELECT e.eventid,e.title 
        FROM events e 
        WHERE NOT EXISTS 
        (SELECT * FROM event_deletes ed WHERE ed.eventid = e.eventid); 
    

    내가 궁금하네요, 그리고 어느 쪽이 더 나은 무엇입니까? 나는 내 자신에 대한 확실한 답을 얻지 못했습니다.

  • +0

    소금 한 알을 가지고 조언 해주십시오. 그 기사 이후 거의 7 년 만에 많은 변화가있었습니다. –

    +0

    InnoDB 대신 MyISAM을 사용할 계획이있는 이유가 있습니까? – AgentConundrum

    +0

    @AgentConundrum ... 우리는 이미 MyISAM을 사용하고 있으며 InnoDB 로의 마이그레이션을 고려 중입니다. 찬반 양론을 조사하고 싶습니다. – Ahmad

    답변

    2

    @ Pentium10에서 말한대로 계획에 본질적으로 잘못된 것은 없습니다. 실제로는 꽤 표준적인 접근 방식입니다.

    MyISAM을 사용하는 경우 UPDATE를 실행하면 쿼리가 실행되는 동안 전체 테이블이 잠길 수 있습니다. 한 번에 하나의 레코드 만 업데이트하거나 삭제할 수 있기 때문에 병목 현상이 발생합니다.

    MyISAM을 사용해야하는 이유가없는 한, 데이터베이스 엔진으로 InnoDB로 전환하는 것이 좋습니다. InnoDB는 행 수준의 잠금을 사용하므로 UPDATE 쿼리는 다른 UPDATE를 차단하지 않습니다. 또한 트랜잭션 및 참조 무결성 제약 조건에 대한 지원과 같은 몇 가지 좋은 기능이 있습니다.

    +0

    예 .. 나는 이해가된다고 생각합니다. 나는 틀 렸습니다. 우리는 InnoDB가 DB 디자인을 최대한 활용할 수 있도록 OPT해야합니다. 참조 무결성을 참조하십시오. 우리는 외래 키를 전혀 사용하지 않습니다. 우리는 코드를 통해 모든 것을 관리하려고 노력합니다. – Ahmad

    0

    여기에서 볼 수있는 유일한 문제는 DELETE 호출에 대한 잠금 만 처리한다는 것입니다.

    UPDATE 및 DELETE 문은 항상 MyISAM 테이블에 단독 잠금을 발행해야한다는 것을 알아야합니다.

    그래서이 기사에서는 UPDATE rowstatus 대신 INSERT를 사용하는 것이 좋습니다. 기사에서 말하는대로해야합니다. 삭제 된 ID를 저장할 전용 테이블을 만들고 삭제되지 않은 레코드를 검색하기위한 선택 항목에 권장 조인을 사용하십시오. 이 방법은 최종 사용자의 삭제 작업에서 테이블에 삽입하기 만하면 테이블에 대한 UPDATE 잠금이 발생하지 않습니다. 두 테이블 모두에 적절한 키를 추가하면 인덱스에서만 조인이 수행되고 SELECT에서는 빠릅니다.

    업데이트 시간을 저장하면 오버 헤드가 발생합니다. 아무 생각없이 그 아이디어를 버려야하며, 레코드가 업데이트 된시기를 알려주지 않을 것입니다.

    +0

    예. 답변 해주셔서 감사합니다. 근본적으로 나는 틀렸다. UPDATED 열을 참조하십시오. 사실 우리는 어떤 정보를 찾기 위해 그것을 사용합니다. 특별히보고 모듈에 – Ahmad