Loading...
MySQL 9.5 Reference Manual 9.5의 10.11.3 Concurrent Inserts의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
MyISAM 스토리지 엔진은 특정 테이블에 대해 리더와 라이터 간의 경합을 줄이기 위해 concurrent insert를 지원합니다. MyISAM 테이블의 데이터 파일에 hole(중간에 삭제된 행)이 없으면, 테이블에서 행을 읽고 있는 SELECT 문과 동시에, 테이블의 끝에 행을 추가하기 위한 INSERT 문을 실행할 수 있습니다. 여러 개의 INSERT 문이 있을 경우, 이들은 대기열에 들어가 순차적으로 실행되며, SELECT 문과 동시에 수행됩니다. concurrent INSERT의 결과는 즉시 보이지 않을 수 있습니다.
concurrent_insert 시스템 변수는 concurrent-insert 처리 방식을 변경하도록 설정할 수 있습니다. 기본적으로 이 변수는 AUTO(또는 1)로 설정되며, concurrent insert는 앞에서 설명한 방식으로 처리됩니다. concurrent_insert를 NEVER(또는 0)로 설정하면, concurrent insert는 비활성화됩니다. 이 변수를 ALWAYS(또는 2)로 설정하면, 삭제된 행이 있는 테이블에 대해서도 테이블 끝에서의 concurrent insert가 허용됩니다. concurrent_insert 시스템 변수에 대한 설명도 참조하십시오.
binary 로그를 사용 중인 경우, concurrent insert는 CREATE ... SELECT 또는 INSERT ... SELECT 문에 대해서는 일반 insert로 변환됩니다. 이는 백업 작업 중 로그를 적용하여 테이블의 정확한 복사본을 다시 생성할 수 있도록 보장하기 위한 것입니다. Section 7.4.4, “The Binary Log”를 참조하십시오.
추가로, 이러한 문에 대해서는 선택된(테이블을 읽는) 테이블에 읽기 락이 걸리며, 그 테이블에 대한 insert가 차단됩니다. 그 결과, 해당 테이블에 대한 concurrent insert 역시 대기해야 합니다.
LOAD DATA에서 MyISAM 테이블이 concurrent insert 조건(즉, 중간에 free 블록이 없음)을 만족할 때 CONCURRENT를 지정하면, 다른 세션은 LOAD DATA가 실행되는 동안에도 그 테이블에서 데이터를 조회할 수 있습니다. CONCURRENT 옵션을 사용하면, 다른 세션이 동시에 그 테이블을 사용하지 않더라도 LOAD DATA의 성능에 어느 정도 영향을 줍니다.
HIGH_PRIORITY를 지정하면, 서버가 --low-priority-updates 옵션과 함께 시작되었다 하더라도 그 옵션의 효과를 무시합니다. 또한 concurrent insert가 사용되지 않도록 합니다.
[LOCK TABLE](https://dev.mysql.com/doc/refman/9.5/en/lock-tables.html "15.3.6 LOCK TABLES and UNLOCK TABLES Statements)의 경우, READ LOCAL과 READ의 차이점은, READ LOCAL이 락이 유지되는 동안 충돌되지 않는 INSERT 문(concurrent insert)의 실행을 허용한다는 점입니다. 그러나 락을 잡고 있는 동안 서버 외부의 프로세스를 사용해 데이터베이스를 조작하려는 경우에는 이를 사용할 수 없습니다.
10.11.2 Table Locking Issues
10.11.4 Metadata Locking