InnoDB 엔진에서의 인덱스와 잠금

Woody·2024년 7월 22일

TIL

목록 보기
1/19

MySQL의 InnoDB엔진은 레코드를 잠그는 것이 아닌 인덱스를 잠그는 방식을 사용한다. 즉, 변경해야 할 레코드를 찾기 위해 검색한 인덱스의 레코드를 모두 잠근다. 아래 예시를 통해 이해를 해보자.

예시

  • employees 테이블에는 아래와 같이 first_name 칼람만 멤버로 담긴 ix_firstname이라는 인덱스가 있다.
  • employees 테이블에서 first_name=’K’인 사원은 전체 253명이 있으며,
    first_name=’K’이고, last_name=’WY’인 사원은 딱 1명만 있는 것을 아래 쿼리로 확인할 수 있다.
  • 이때, employees 테이블에서 first_name=’K’이고, last_name=’WY’인 사원의 입사일자를 오늘로 변경하는 쿼리를 실행해보자.
UPDATE employees SET hire_date=NOW() WHERE first_name=’K’ AND last_name=’WY’;

결과적으로 1건의 레코드가 업데이트되겠지만, 이 1건의 업데이트를 위해 first_name=’K’인 253건의 레코드가 모두 잠긴다.

만약 인덱스가 하나도 없다면 테이블을 풀 스캔하면서 UPDATE 작업을 하게 되어, 이 과정에서 테이블에 있는 모든 레코드를 잠그게 된다.

MySQL의 InnoDB에서 인덱스 설계가 중요한 이유가 알 수 있었다.


출처) Real MySQL 5.3.2 인덱스와 잠금

0개의 댓글