작성일:

MySQL 테이블에 Text 파일을 빠르게 Insert 하는 방벙

MySQL LOAD DATA

LOAD DATA statement

사전 준비 : secure_file_priv

  • secure_file_priv 의 설정값이 NULL 로 되어 있는데 빈문자열로 수정해야 함
SHOW VARIABLES LIKE 'secure_file_priv'  -- NULL 
  • my.cnf 에서 수정 및 재시작 필요
[mysqld]
secure-file-priv=""

LOAD DATA 최소 설정

LOAD DATA INFILE '/path/data.txt' INTO TABLE data_table 
Field and Line Handling : Default 설정
LOAD DATA INFILE '/path/data.txt' INTO TABLE data_table
FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'
LINES TERMINATED BY '\n' STARTING BY ''
헤더 라인 무시
LOAD DATA INFILE '/path/data.txt' INTO TABLE data_table IGNORE 1 LINES

LOAD DATA 기본 설정 (CSV)

LOAD DATA INFILE '/path/data.txt' IGNORE INTO TABLE data_table 
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '"'
LINES TERMINATED BY '\n' 
(filed1, filed2, filed3 )
Duplicate-Key and Error Handling
  • IGNORE : unique key 값이 있으면 새로운 행은 버려짐 default
  • REPLACE : unique key 값 기준으로 새로운 행으로 변경
필드 개수, 순서
  • 기본적으로 파일의 구분자 기준 순서와 필드와 1:1 매치됨
  • 필드 지정을 통해 순서 조정 가능
    • 파일의 구분자 필드가 많으면 : 버려짐
    • 테이블의 필드가 많으면 : 나머지 필드는 Default 값이나 NULL 처리 (NULL 허용시)
Input Preprocessing
  • 테이블의 중간 필드를 무시 (Default 값 or NULL 처리) 하려면 @dummy 키워드로 필드 지정
  • 필드 가공은 SET 명령으로 처리
  • @변수 명으로 받아서 가공후 필드에 지정할 수 있음
LOAD DATA INFILE '/path/data.txt' IGNORE INTO TABLE data_table 
FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' 
(filed1, @dummy, filed3, @var1, filed5 )
SET filed2 = CURRENT_TIMESTAMP, filed4 = @var1 * 2;
Index Handling : LOAD DATA 문의 성능향상을 위한 Index check option
  • unique index checks option : SET unique_checks = 0 SET unique_checks = 1
  • foreign key check option : SET foreign_key_checks = 0 SET foreign_key_checks = 1

로컬(클라이언트) 데이터 원격 INSERT

사전 준비 : local_infile 설정 (server and client)
  • server : local_infile 의 설정값이 ON(1) 로 수정해야 함
  • client : 접속시 --local-infile 옵션 추가
SHOW VARIABLES LIKE 'local_infile' ; -- OFF
SET GLOBAL local_infile = 1 ;
SHOW VARIABLES LIKE 'local_infile' ; -- ON
LOCAL PATH 지정
  • LOAD DATA LOCAL INFILE ...
LOAD DATA LOCAL INFILE '/path/data.txt' INTO TABLE data_table 

댓글남기기