2013-07-22 5 views
0

엉망인 데이터베이스를 수정하려고합니다. 나는이 DB에 여러 개의 MyISAM 테이블과 InnoDB 테이블을 가지고있다. 나는 다음과 같은 3 개 테이블을 사용하는 쿼리 작성해야합니다 : 실행MyISAM과 InnoDB 함께 쿼리 할 때 테이블 잠금 문제가 발생했습니다

table_a => InnoDB 
table_b => InnoDB 
table_c => MyISAM 

쿼리가 분 정도 걸립니다 나는이 테이블 수준 잠금이 발생한다면 우리의 생산 사이트에서 만들 수있는 문제에 대한 걱정을 나는 내 질문. 나는 그것들이 문서에 기초 할 지 확신하지 못한다. MyISAM이 테이블을 잠그고 InnoDB가 행을 잠그는 것을 알고 있지만 함께 사용하고 있습니다. 다음은 쿼리입니다.

INSERT INTO 
    table_a (`x`, `y`, `z`) 
SELECT 
    table_b.x, table_b.y, table_c.z 
FROM 
    table_b, table_c 
WHERE 
    table_b.id = table_c.id AND 
    table_b.value IS NOT NULL AND 
    table_b.id NOT IN (SELECT table_a.id FROM table_a WHERE 1); 

이 쿼리가 실행될 때 어떤 일이 발생할지 잘 모르겠습니다. InnoDB 인 table_a에서 쓰기가 발생하기 때문에 테이블 잠금이 발생하지 않는다고 생각합니다. 그러나 쓰기 연산이 MyISAM과 InnoDB 모두에서 발생하는 읽기에 기반하기 때문에 이것이 어떻게 관리 될지 확신 할 수 없습니다. 나는 아직 로킹이 어떻게 관리되는지 잘 모르겠다.이 쿼리가 실행되는 동안 이들 테이블 중 어떤 것이 잠길지를 알아야한다. 도움이되는 사람 누구에게나 감사합니다.

답변

1

table_c (MyISAM)은 쿼리 과정에서 "읽기 모드"로 잠길 수 있습니다. 즉,이 테이블에서 동시 읽기가 가능하지만 동시 쓰기가 유지됩니다.

단일 쓰기가 보류 상태이면 모든 후속 읽기도 HIGH_PRIORITY에서 실행되지 않는 한 보류 상태가됩니다.

다른 두 InnoDB 테이블은 매우 유사한 동작을 나타내지 만 전체 테이블에는 없을 수 있습니다. 적절한 절을 사용하여 일치 절과 JOIN 조건을 충족시킬 수있는 경우 "일부"행만 잠기 게됩니다 (테이블 스캔이 필요한 경우 전체 테이블이 잠길 가능성이 있습니다. 적절한 인덱스를 사용할 수없는 경우, 그건).

+0

아마도 MyISAM 테이블을 InnoDB로 마이그레이션해야한다. 요즘에는 MyISAM을 사용하는 것이 실제로 도움이되는 경우는 많지 않습니다. – RandomSeed

+0

읽기와 쓰기가 table_b에서 괜찮을 것으로 보이지만 다른 세션에서는 table_a를 쓸 수 없습니다. 다른 세션은 table_b 및 table_c를 읽을 수 있습니다. table_a도 읽을 수 있습니다. 작업이 끝날 때까지는 쓰지 않습니다. 나는 모든 세션의 읽기 및 쓰기 조합을 테스트하려고합니다. – usumoio

+0

@IamJohnGalt 마지막 버전에서 오타를 조심하십시오. 나는'table_c'을 의미했습니다. 전체 테이블이 마지막 하위 쿼리에서 스캔되기 때문에 전체'table_a '가 "읽기 모드"에서 잠겨 있습니다. 'NOT IN'을'LEFT OUTER JOIN'으로 대체해야합니다. – RandomSeed