8.2.2.1 INSERT 문의 속도
삽입의 속도를 최적화하려면 많은 작은 작업을 하나의 큰 작업에 결합합니다. 이상적으로는 단일 연결을 만들고 많은 새로운 행의 데이터를 한번에 전송하고 모든 인덱스의 업데이트와 일관성 검사를 마지막까지 연기합니다.
행의 삽입에 필요한 시간은 다음 요소에 따라 결정됩니다. 여기서의 숫자는 대략적인 비율을 보여줍니다.
연결 : (3)
서버에 쿼리 전송 : (2)
쿼리의 해석 : (2)
행 삽입 : (1 × 행 크기)
인덱스 삽입 : (1 × 인덱스 수)
클로우즈 : (1)
여기에는 테이블을 여는 초기 오버 헤드를 고려하지 않습니다. 이것은 동시 실행 쿼리마다 한 번씩 실행됩니다.
테이블의 크기에 따라 log N
만 인덱스의 삽입 속도가 느려집니다 (B 트리 인덱스 인로).
다음 방법을 사용하여 삽입 속도를 높일 수 있습니다.
동일한 클라이언트에서 동시에 여러 행을 삽입하려면 여러
VALUES
목록에서INSERT
문을 사용하여 동시에 여러 행을 삽입합니다. 이것은 개별 단일 행INSERT
문을 사용하는 것보다 훨씬 (경우에 따라서는 수배) 빨라집니다. 하늘이 아닌 테이블에 데이터를 추가하는 경우 데이터 삽입을 더 빨리하기 위해bulk_insert_buffer_size
변수를 조정할 수 있습니다. 섹션 5.1 "서버 시스템 변수" 를 참조하십시오.텍스트 파일에서 테이블을로드하는 경우는
LOAD DATA INFILE
을 사용합니다. 일반적으로INSERT
문을 사용하는 경우보다 20 배 빨라집니다. 섹션 13.2.6 "LOAD DATA INFILE 구문" 을 참조하십시오.열에 기본값이있는 것을 이용합니다. 삽입 값이 기본값과 다른 경우에만 명시 적으로 값을 삽입합니다. 이렇게하면 MySQL이 실행해야하는 분석이 줄어들고 삽입 속도가 향상됩니다.
InnoDB
테이블에 고유 팁, 섹션 8.5.4 "InnoDB 테이블의 대량 데이터로드" 를 참조하십시오.MyISAM
테이블에 고유 팁, 섹션 8.6.2 "MyISAM 테이블의 대량 데이터로드" 를 참조하십시오.