mysql - update - table unlock




대형 테이블의 행 레벨 잠금보다 테이블 레벨 잠금이 더 나은 이유는 무엇입니까? (4)

테이블 잠금을 사용하면 많은 세션이 동시에 테이블에서 읽을 수 있습니다.

매우 높은 잠금 속도를 달성하기 위해 MySQL은 테이블 잠금을 사용합니다

"나는 로우 레벨 잠금이 더 좋다고 생각한다.

이 페이지에서는 처음에는 "더 나은"것이 잘못 정의되었습니다. 더 나은 것은 "더 빠름"을 의미합니다.

행 레벨 잠금은 잠금에 대한 경합으로 인해 (일반적으로) 더 빠를 수 없습니다. 큰 결과 집합의 각 행을 잠그면 다른 큰 결과 집합 쿼리 및 롤백과 충돌 할 가능성이 매우 높습니다.

MySQL 매뉴얼 에 따르면 :

대형 테이블의 경우 테이블 잠금은 행 잠금보다 나은 경우가 많으며,

왜 이런거야? 큰 테이블을 잠그면 더 많은 데이터를 잠그기 때문에 행 수준의 잠금이 더 나은 것으로 가정합니다.


(사전 편집) link

더 많은 잠금을 확보해야하기 때문에 테이블의 큰 부분에서 사용될 때 페이지 수준 또는 테이블 수준 잠금보다 느립니다.

행 또는 2를 치는 경우에만 행 수준 잠금을 사용하십시오. 코드가 많은 행 또는 알려지지 않은 행에 닿는 경우 테이블 잠금을 유지하십시오.


테이블 수준 잠금은 주요 데이터 수정이 이루어지는 큰 테이블에 적합합니다. 이를 통해 시스템은 gazillion 잠금 (각 행에 하나씩)을 처리하지 않고 테이블에 대한 단일 잠금으로 경합 할 수 있습니다.

RDBMS는 내부적으로 잠금 레벨을 자동으로 확대합니다.


  • 행 잠금은 테이블 또는 페이지 수준 잠금보다 더 많은 메모리가 필요합니다.

  • 더 많은 자원을 소비하는 행 잠금으로 더 많은 잠금을 확보해야합니다.

http://www.devshed.com/c/a/MySQL/MySQL-Optimization-part-2/

  • 행 수준 잠금의 장점 :

    • 많은 스레드에서 다른 행에 액세스 할 때 잠금 충돌이 줄어 듭니다.
    • 롤백에 대한 변경 사항이 적습니다.
    • 단일 행을 오랫동안 잠글 수 있습니다.
  • 행 수준 잠금의 단점 :

    • 페이지 수준 또는 테이블 수준 잠금보다 많은 메모리를 사용합니다.
    • 더 많은 잠금을 확보해야하기 때문에 테이블의 큰 부분에서 사용될 때 페이지 레벨 또는 테이블 레벨 잠금보다 느립니다.
    • 많은 수의 데이터에서 GROUP BY 연산을 자주 수행하거나 종종 전체 테이블을 스캔해야하는 경우 다른 잠금보다 훨씬 나쁩니다.
    • 상위 레벨 잠금을 사용하면 잠금 오버 헤드가 행 레벨 잠금보다 적기 때문에 다른 유형의 잠금을보다 쉽게 ​​지원하여 응용 프로그램을 조정할 수 있습니다.
  • 테이블 잠금은 다음과 같은 경우 페이지 수준 또는 행 수준 잠금보다 월등합니다.

    • 테이블에 대한 대부분의 명령문은 읽기입니다.
    • 단일 키로 페치 할 수있는 행을 갱신하거나 삭제하는 엄격한 키에 대한 읽기 및 갱신 : UPDATE tbl_name SET column=value WHERE unique_key_col=key_value; DELETE FROM tbl_name WHERE unique_key_col=key_value;
    • 동시 INSERT 문 및 매우 적은 수의 UPDATE 및 DELETE 문과 결합 된 SELECT입니다.
    • 작성자없이 전체 테이블에서 많은 스캔 또는 GROUP BY 조작.






table-locking