2010-06-09 2 views
2

따라서 성능 문제와 관련하여 Performance in PDO/PHP/MySQL: transaction versus direct execution을 읽은 후에 MySQL에 대한 테이블 잠금에 대한 연구를했습니다. http://dev.mysql.com/doc/refman/5.0/en/table-locking.htmlMySQL의 잠긴 테이블이 관련 뷰에 영향을 줍니까?

테이블 잠금에

동시에, 에서 테이블에서 읽어 많은 세션을 가능하게하지만 세션이 테이블에 기록하고자하는 경우, 먼저 독점 액세스 할 수 있어야합니다. 업데이트 중에이 특정 테이블에 액세스하려는 다른 모든 세션은 업데이트가 완료 될 때까지 대기해야합니다.

이 부분은 특히 대부분의 쿼리가 삽입이 아닌 업데이트가 될 것이기 때문에 저를 강타했습니다. 나는 모든 업데이트/삽입이 수행 된 foo라는 테이블을 만든 다음 모든 선택이 발생한 foo_view (foo 사본 또는 foo 및 여러 다른 테이블과 foo의 연결) 뷰를 작성했는지 궁금합니다. 잠금 문제가 계속 발생합니까?

즉, foo_view에 대한 SELECT 쿼리는 여전히 업데이트가 foo에서 끝날 때까지 기다려야합니까?

동료가 물어 본 또 다른 간단한 질문입니다. 이것은 캐싱에 영향을 줍니까? 나는. SELECT가 캐시되면 캐시에 도달하고 결과를 리턴 할 것인가, 아니면 잠금이 먼저 완료 될 때까지 기다릴 것인가?

답변

3

보기는 기본 테이블과 동일한 잠금을 경험합니다. MySQL의 참조 페이지에서

locking에 :

MySQL을 부여 테이블 쓰기 잠금 다음과 같이 :

  1. 테이블에 아무런 잠금 장치가없는 경우

    는, 그 위에 쓰기 잠금을 넣어.
  2. 그렇지 않으면 잠금 요청을 쓰기 잠금 대기열에 넣으십시오. 테이블에는 쓰기 잠금이없는 경우에 읽기 잠금을 넣어

    1. : 다음과 같이

    MySQL을 부여 테이블 잠금을 읽어 보시기 바랍니다.

  3. 그렇지 않으면 잠금 요청을 읽기 잠금 대기열에 넣으십시오.

사용중인 데이터베이스 엔진에 따라 다릅니다. MyISAM은 위의 단계를 수행하고 InnoDB과 같은 엔진이 행 수준 잠금을 대신 수행하는 전체 테이블을 잠글 것입니다 (여러 파티션으로 분할 된 경우에도 해당).

MyISAM에서 필요한 성능 벤치 마크에 도달하지 못했고 병목 현상이 업데이트를 통해 테이블 ​​잠금을 기다리고있는 것으로 나타나면 테이블의 스토리지 엔진을 InnoDB로 변경하는 것이 좋습니다.

+0

답변 해 주셔서 감사합니다. 나는 캐싱에 대해 물어보기 위해 나의 질문을 수정했다. 쿼리가 캐시 된 경우 잠금이 잠금을 대신합니까? 아니면 잠금이 열린 후에 만 ​​캐시 된 쿼리 결과가 반환됩니까? – CogitoErgoSum

+0

@CogitoErgoSum : 아니요, 쿼리 계획 캐싱은 격리 수준에 영향을주지 않습니다. –

+0

OMG 조랑말 감사합니다! – CogitoErgoSum

관련 문제