메뉴 건너뛰기

2016.12.22 19:00

MySQL INSERT 성능 향상

조회 수 11523 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

MySQL INSERT 성능 향상

MySQL 테이블에 INSERT 구문을 수행 시킬때 성능을 향상시킬 수 있는 방법입니다.

여러 데이터를 INSERT 구문으로 수행시 VALUES 리스트를 다중으로 사용하는것이 개별적으로 INSERT것보다 빠릅니다. 비어 있지 않은 테이블에 INSERT를 수행한다면 my.ini 파일 안에 bulk_insert_buffer_size 를 변경하여 속도를 개선 시킬 수 있습니다.

1.INSERT INTO `테이블` (필드1, 필드2) VALUES ('값1', '값2'),('값1', '값2')...('값1', '값2');

# My.ini 파일 내에 bulk insert buffer size를 변경하고 MySQL을 재시작 합니다.
bulk_insert_buffer_size = 64M

여러 클라이언트에서 대량의 데이터를 삽입을 한다면 INSERT DELAYED 명령문을 사용하면 속도를 개선 할 수 있습니다. 서버로 부터 수행 응답을 받은 후 큐에 적재 후 테이블에 사용이 되지 않을때 테이블에 삽입이 됩니다.  INSERT DELAYED 는 MyISAM, MEMORY, ARCHIVE 테이블에서 사용 가능합니다. 그외 테이블에서는 성능 저하가 발생 할 수 있습니다. affected row 값은 테이블이 바쁘지 않을때는 정확한 값을 출력을 하나 그렇지 않을때는 1의 값을 반환을 합니다. DELAYED 이외에 LOW_PRIORITY, IGNORE, HIGI_PRIORITY 등을 이용하여 작업의 순위, 중복 오류등을 무시 할 수 있습니다.
LOW_PRIORITY : 최 하위 순위로 INSERT구문을 수행합니다. 다른 클라이언트의 SELECT가 종료된 후 수행합니다.
IGNORE : 키 중복 (PRIMARY KEY, UNIQUE KEY)의 오류를 무시하고 진행합니다.
HIGH_PRIORITY : 최 우선 작업으로 INSERT구문을 수행합니다.

INSERT DELAYED 구문을 수행할때에는 Slave replaction 와는 다른 데이터를 가질 수 있습니다.
1.INSERT DELAYED INTO `테이블` (필드1, 필드2) VALUES ('값1', '값2'),('값1', '값2')...('값1', '값2');

대량의 데이터를 삽입을 할때는 LOAD DATA INFILE 을 사용합니다. 대량의 데이터를 INSERT 구문을 이용해서 삽입을 하는것 보다, 필드 구분자로 분리가된 LOAD DATA INFILE 을 이용하면 INSERT 구문보다 매우 빠른 동작을 합니다.

Slave Replaction 에 동일한 구문이 전달이 가능하고 INSERT가 가능합니다.
1.-- 필드 구분이 , (쉼표) 로 되어 있고 라인 구분이 개행으로 되어 있을때 아래와 같이 수행하면 됩니다.
2.LOAD DATA INFILE '파일경로' INTO TABLE `테이블명` FIELDS TERMINATED BY ',' LINES TERMINATED By '\r'

INDEX가 많이 사용된 테이블에 대량으로 INSERT 구문 시 INDEX를 비활성화 한 후 수행을 하는것이 좋습니다. 한개의 열을 삽입하고 인덱스를 계산 후 다시 다른 행을 삽입하는 것 보다는 전체 키를 비 활성화 한 후에 데이터 입력이 종료되고 다시 키를 활성화 시키는것이 전체적으로 빠른 수행을 할 수 있습니다.
1.-- 테이블의 INDEX를 비활성화 시킵니다.
2.ALTER TABLE `테이블` DISABLE KEYS;
3.-- 대량 INSERT 구문을 수행합니다.
4.INSERT INTO `테이블` VALUES ('값1', '값2')....;
5......
6.INSERT INTO `테이블` VALUES ('값1', '값2')....;
7.-- 수행이 종료된 후 다시 INDEX를 활성화 시킵니다. 
8.ALTER TABLE `테이블` ENABLE KEYS;

트랜젝션이 지원하지 않는 테이블PROCEDURE , FUNCTION , 다중 쿼리문 에서 수행되는 INSERT연산의 속도를 향상 시키기 위해서는 테이블 잠금을 실행하여 속도를 향상 시킬 수 있습니다. 인덱스 버퍼 플러시를 매번 수행하지 않고 모든 INSERT 구문의 모든 열이 삽입 되었을때 인덱스 버퍼 플러시가 이루어져 성능향상이 됩니다.
1.-- 테이블의 WRITE 잠금을 수행합니다.
2.LOCK TABLES `테이블` WRITE;
3.-- 대량 INSERT 구문을 수행합니다.
4.INSERT INTO `테이블` VALUES ('값1', '값2')....;
5......
6.INSERT INTO `테이블` VALUES ('값1', '값2')....;
7.-- 테이블의 WRITE 잠금을 해제 합니다.
8.UNLOCK TABLES `테이블` WRITE;


트랜젝션이 지원하는 테이블에서는 START TRANSACTION 과 COMMIT을 활용하면 성능이 향상이 됩니다.

위와 같이 MySQL INSERT 수행시 성능을 향상시킬 수 있습니다.


List of Articles
번호 제목 날짜 조회 수
126 한글정렬 order by 2019.02.19 2424
125 하나의 쿼리로 여러 테이블의 데이터 삭제 file 2020.07.28 893
124 필드 변경, 추가, 삭제 2016.12.23 6085
123 특정 테이블만 replication 하거나 제외하는 방법 2018.07.18 2824
122 특정 COLUMN을 제외하고 SELECT/INSERT하는 방법 2017.11.16 8866
121 테이블, 컬럼 charset 변경 2021.03.26 186
120 테이블, 레코드 복사 2021.03.26 164
119 테이블 파티셔닝 2017.12.22 4940
118 테이블 타입(Heap, MyIsam, InnoDB...) 변경하기 2017.04.12 5277
117 테이블 체크, 백업 2016.12.23 7478
116 테이블 복사, 테이블 비우기 2016.12.23 5783
115 컬럼에 포함된 특정문자열을 검색해서 그 문자로 또 다른 테이블검색하기 2016.08.30 6606
114 컬럼내 특정 문자를 다른문자로 변경하고자 할때 2014.02.27 6012
113 중복데이터 하나만 빼고 삭제 2019.01.11 3163
112 전체 텍스트 검색과 파티션 file 2017.12.22 3946
111 전체 텍스트 검색과 파티션 file 2017.12.22 3868
110 일반적인 오류를 해결하는 유용한 정보들 file 2020.11.23 3864
109 이벤트 스케줄러 등록하기 file 2020.06.29 303
108 월의 마지막 일수를 반환하는 함수입니다 2015.12.19 5996
107 외부접근 권한 주기 file 2016.12.23 5949
Board Pagination Prev 1 2 3 4 5 6 7 Next
/ 7

하단 정보를 입력할 수 있습니다

© k2s0o1d4e0s2i1g5n. All Rights Reserved