본문 바로가기

프로그래밍/mysql

mysql - 테이블 잠금(LOCK TABLES)의 단점 보완방법

반응형

테이블 잠금(LOCK TABLES)의 단점 보완방법
leave a comment ≫

Ads by Google
MS SQL Server 2005 Tools
MS SQL Server Database Admin Tools Download Now! Windows, Linux, OSX
www.aquafold.com

 


현재 MySQL은 테이블 핸들러로는 대표적으로 MyISAM, BDB, InnoDB, Heap등이 있으며,

이것은 데이터베이스(database)에 테이블(table)을 설치(CREATE TABLE )할 때 선택(Type)할 수 있다.

CREATE TABLE TABLE-NAME (
….
….
) TYPE=MyISAM;
MyISAM은 테이블 잠금(LOCK TABLES)을,
BDB는 page레벨 잠금을 그리고 InnoDB는 row 단위 잠금(LOCK ROWS)을 지원한다.

 

 

테이블 잠금(LOCK TABLES)의 단점

SELECT명령문을 어떤 클라이언트가 요청 한다.
그런 후에 다른 클라이언트 하나가 동일한 테이블에서 UPDATE를 실행한다.
이 클라이언트는 SELECT가 끝날 때까지 대기를 한다.
또 다른 클라이언트 하나가 동일한 테이블에서 별도의 SELECT 명령문을 입력한다.
UPDATE 는 SELECT 보다 우선 순위가 높기 때문에, 이 SELECT 명령문은 UPDATE가 마칠 때까지,
그리고 처음의 SELECT가 끝날 때까지 대기를 한다.
 

 

테이블 잠금(LOCK TABLES)에 의해
야기되는 경쟁 상황을 피하거나 또는 절감 시킬 수 있는 여러 가지 방법

짧은 시간 동안만 테이블을 잠그도록 하기 위해 SELECT 명령문이 빠르게 구동되도록 만든다.
이렇게 하기 위해서는 요약 테이블을 생성해야 할 것이다.
mysqld를 ?low-priority-updates와 함께 시작한다.
이것은 테이블을 업데이트하는 모든 명령문에 대해서 SELECT 명령문 보다 낮은 우선 순위를 할당해 준다.
이렇게 하면, 앞의 시나리오에서 나오는 두 번째 SELECT 명령문은 UPDATE 명령문 보다 먼저 실행이 되며, 처음 SELECT가 끝날 때까지 대기를 할 필요가 없게 된다.
SET LOW_PRIORITY_UPDATES=1 명령문을 사용하면,
특정 접속에서 입력된 모든 업데이트에 대해서는 낮은 우선 순위를 가지도록 지정할 수가 있다.
LOW_PRIORITY 속성을 사용하면 특정 INSERT, UPDATE, 또는 DELETE 명령문이 낮은 우선 순위를 가지도록 할 수 있다.
HIGH_PRIORITY 속성을 사용하면 특정 SELECT 명령문이 높은 우선 순위를 가지도록 만들 수가 있다.
mysqld이 max_write_lock_count 시스템 변수에 대해서 낮은 우선 순위를 가지고 시작하도록 해서
MySQL로 하여금 특정 수의 열 삽입이 이루어진 테이블을
기다리는 모든 SELECT 명령문의 우선 순위를 임시적으로 높이도록 만들 수가 있다.
특정 수의 WRITE 잠금을 실행한 후에 READ 잠금을 허용한다.
만일 여러분이 SELECT와 연결되어 있는 INSERT에 문제를 가지고 있다면,
MyISAM 테이블 변환(switching)을 고려해 볼만 한데,
이것은 동시 SELECT 및 INSERT 명령문을 지원한다.
만일 여러분이 동일한 테이블에서 삽입과 삭제를 혼용해서 사용한다면,
INSERT DELAYED 가 매우 큰 도움을 줄 것이다.
만일 SELECT 및 DELETE 명령문 혼용에 있어서 어떠한 문제가 발생한다면,
DELETE에 대한 LIMIT 옵션이 도움이 될 것이다.
SQL_BUFFER_RESULT를 SELECT 명령문과 함께 사용하는 것이 테이블 잠금 기간을 줄이는데 도움이 될 것이다.
mysys/thr_lock.c에 있는 잠금 코드를 변경 시키면 단일 큐를 사용할 수가 있다.
이렇게 하면, 쓰기 잠금 및 읽기 잠금은 동일한 우선 순위를 가지게 되며,
몇몇 어플리케이션 실행에 도움이 되기도 한다.

반응형