MyISAM이나 MEMORY 스토리지 엔진은 자체적인 잠금을 가지지 않고 MySQL 엔진에서 제공하는 테이블 락을 그대로 사용한다.이 두 스토리지 엔진에서는 "쿼리 단위"로 필요한 잠금을 한꺼번에 모두 요청해서 획득하기 때문에 데드락(Deadlock)이 발생할 수 없다.
00. 잠금 획득 방법
1) 읽기 잠금
테이블에 쓰기 잠금이 걸려 있지 않으면 바로 읽기 잠금을 획득하고 읽기 작업을 시작할 수 있다.
2) 쓰기 잠금
테이블에 아무런 잠금이 걸려 있지 않아야만 쓰기 잠금을 획득할 수 있고, 그렇지 않다면 다른 잠금이 해제될 때까지 대기해야 한다.
01. 잠금 튜닝
테이블 락에 대한 작업 상황은 MySQL의 상태 변수를 통해 확인할 수 있다.
mysql> SHOW STATUS LIKE 'Table%';
+ --------------------- + -------+
| Variable_name | Value |
+ --------------------- + -------+
| Table_locks_immediate | 115321 |
| Table_locks_waited | 33421 |
+ --------------------- + -------+
"Table_locks_immediate"는 바로 잠금을 획득한 횟수이며, "Table_locks_waited"는 다른 잠금이 이미 해당 테이블을 사용하고 있어서 기다려야 했던 횟수를 누적해서 저장하고 있다. 위의 상태변수를 조회해서 두 변수의 비율을 비교해 보면 테이블 잠금을 대기하는 쿼리가 어느 정도인지 알아낼 수 있다.
잠금 대기 쿼리 비율 = Table_locks_waited / (Table_locks_immediate + Table_locks_waited) * 100
이 잠금 대기 쿼리 비율을 고려하여 비율이 높고 테이블 잠금 때문에 경합(Lock contention)이 많이 발생하고 있다면 처리 성능이 영향을 받고 있음을 의미하므로, 테이블을 분리하거나 InnoDB 스토리지 엔진으로 변환하는 방법을 고려해 보는 것이 좋다. InnoDB 스토리지 엔진은 레코드 단위 잠금을 사용하기 때문에 집계에 포함되지 않기 때문이다.
반응형
'MySQL' 카테고리의 다른 글
06. 트랜잭션에 대한 격리 수준(isolation level) (0) | 2020.06.23 |
---|---|
05. InnoDB 트랜잭션 처리 및 로그(Undo/Redo) 관리 (0) | 2020.06.23 |
04. MySQL에서의 잠금 - (1) MySQL 엔진 (0) | 2020.06.15 |
03. 트랜잭션 (0) | 2020.06.15 |
02. InnoDB 스토리지 엔진 아키텍처 (0) | 2020.06.13 |