LOAD DATA INFILE 이란?
- 파일을 읽어 테이블로 데이터를 입력하는 명령어이다. 한번에 많은 데이터를 입력해야 할 때 주로 사용된다.
다량의 데이터를 테이블에 insert하기위해 방법을 검색하던 중 INSERT문 보다 20배정도 빠르다는 LOAD DATA INFILE 이라는 것을 발견하였다.
특정 파일을 지정하고 옵션을 추가해줘서 insert문을 실행할 수 있다.
LOAD DATA INFILE '/home/test/soondev/test.txt'
REPLACE INTO TABLE test_table
FIELDS
TERMINATED BY '|'
LINES
TERMINATED BY '\n'
(a, b, c, d, e, f, g, h, i);
두 번째 줄에 REPACE 옵션과 IGNORE 옵션을 사용 할 수 있다.
- REPLACE : 중복 레코드 발생시 새로 입력되는 레코드로 덮어쓴다.
- IGNORE : 중복 레코드 발생시 새로 입력되는 레코드를 무시한다.
세 번째 줄은 파일안에 들어가는 컬럼들을 구분 할 문자를 지정하는 것이다.
- ex) a|b|c|d 라고 한다면 INSERT INTO test_table ('a','b','c','d') 가 되는 것
다섯 번째 줄은 다음 줄로 넘어가는 문자를 지정하는 것이다.
- ex)
a|b|c|d
c|c|c|c
가 있다면 \n으로 구분하여 INSERT INTO test_table ('a','b','c','d'),('c','c','c','c') 가 된다
마지막 줄은 들어갈 컬럼 수를 지정한다.
LOAD DATA INFILE은 10000건 이상부터 체감이 잘 되는 명령어라고 생각된다.
실제로 사용해보자
리눅스 mariadb 실행 버전은 10.7.8
사용할 파일은 130M .txt 파일이며 안에 들어가있는 내용은
data1|data2|data3|data4|data1|data2|data3|data4
data1|data2|data3|data4|data1|data2|data3|data4
data1|data2|data3|data4|data1|data2|data3|data4
data1|data2|data3|data4|data1|data2|data3|data4
위 형태로 들어가 있다.
사용할 테이블을 만들고
테이블 명은 test_table
LOAD DATA INFILE '/home/파일위치/파일이름.txt'
REPLACE INTO TABLE test_table
FIELDS
TERMINATED BY '|'
LINES TERMINATED BY '\n'
(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q);
위 명령어를 실행해주면
약 70만건의 데이터가 들어갔고 mysql workbanch에서 확인을 해보면
위명령어에 사용했던 REPLACE가 적용되서 중복발생 9만건정도를 제외하고 60만건이 들어온 것을 확인 할 수있다.
리눅스에서 LOAD DATA INFILE 명령어를 사용했을때 30초도 걸리지 않았던것 같다.
'데이터베이스' 카테고리의 다른 글
[MYSQL] Update Trigger 사용 (2) | 2023.12.04 |
---|---|
[mysql] 대소문자 구분 설정하기 (0) | 2023.02.23 |
[mysql] 통계쿼리, WITH ROLLUP 사용하기 (0) | 2022.10.06 |
[mysql] update join 다중 데이터 넣기 (0) | 2022.09.30 |
ibatis 동적 쿼리 수행 시 autoResultMap 에러 (0) | 2022.09.02 |