엉망인 데이터베이스를 수정하려고합니다. 나는이 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 모두에서 발생하는 읽기에 기반하기 때문에 이것이 어떻게 관리 될지 확신 할 수 없습니다. 나는 아직 로킹이 어떻게 관리되는지 잘 모르겠다.이 쿼리가 실행되는 동안 이들 테이블 중 어떤 것이 잠길지를 알아야한다. 도움이되는 사람 누구에게나 감사합니다.
아마도 MyISAM 테이블을 InnoDB로 마이그레이션해야한다. 요즘에는 MyISAM을 사용하는 것이 실제로 도움이되는 경우는 많지 않습니다. – RandomSeed
읽기와 쓰기가 table_b에서 괜찮을 것으로 보이지만 다른 세션에서는 table_a를 쓸 수 없습니다. 다른 세션은 table_b 및 table_c를 읽을 수 있습니다. table_a도 읽을 수 있습니다. 작업이 끝날 때까지는 쓰지 않습니다. 나는 모든 세션의 읽기 및 쓰기 조합을 테스트하려고합니다. – usumoio
@IamJohnGalt 마지막 버전에서 오타를 조심하십시오. 나는'table_c'을 의미했습니다. 전체 테이블이 마지막 하위 쿼리에서 스캔되기 때문에 전체'table_a '가 "읽기 모드"에서 잠겨 있습니다. 'NOT IN'을'LEFT OUTER JOIN'으로 대체해야합니다. – RandomSeed