programing

INSERT ... SELECT를 사용하여 잠금 대기 시간 초과를 방지하는 중

starjava 2023. 8. 15. 09:41
반응형

INSERT ... SELECT를 사용하여 잠금 대기 시간 초과를 방지하는 중

InnoDB를 가지고 있습니다.books내 앱을 위한 테이블.하루에 몇 번씩 아주 많은 수의 독립적인 사람들이INSERT그리고.UPDATE쿼리가 에 대해 실행됩니다.books테이블.

앱에 대한 수신 요청은 다음을 기반으로 임시 테이블을 생성합니다.books사용하여INSERT INTO [tmp table] (SELECT FROM books ...).

의 MySQL 문서에 따르면 이 구문은 다음과 같이 잠깁니다.books온도 테이블이 채워질 때까지.

이러한 선택, 삽입 및 업데이트의 잠금 조합books테이블이 주기적으로 MySQL을 오버로드하여 잠금 대기 시간 초과를 발생시킵니다.

저는 이 페르코나 기사에서 제안을 시도했습니다.SELECT부터books아웃파일로, 하는 것.INSERT별책으로이렇게 하면 선택한 잠금이 방지되지만 로드 속도가 너무 느립니다.

제가 다른 대안을 놓쳤나요?INSERT ... SELECT그것은 잠기지 않을 것입니다.books성능에 영향을 미치지 않는 테이블?

저는 MySQL 초보자이고 아마 문제를 잘못 이해했을 것입니다.

INSERT INTO [tmp table] (SELECT FROM books ...)

에 잠금을 설정하면 안 됩니다.books의 테이블 뿐인tmp_table트랜잭션 격리 수준이 직렬화되지 않은 경우.

업데이트는 InnoDB가 트랜잭션 끝까지 모든 행에 잠금을 유지할 필요가 없도록 READ COMMITED 분리 수준에서 실행할 수 있습니다(WHERE 부분이 인덱스 열로만 구성된 경우에만 작동함).

언급URL : https://stackoverflow.com/questions/54373405/preventing-lock-wait-timeouts-with-insert-select

반응형