Skip to content

Commit 10d858d

Browse files
update post
1 parent 2bec995 commit 10d858d

File tree

1 file changed

+58
-16
lines changed

1 file changed

+58
-16
lines changed

_posts/2025-07-16-mysql-load-data.md

Lines changed: 58 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ layout: "post"
33
title: "[MySQL] LOAD DATA로 대용량 데이터 빠르게 삽입하기"
44
description:
55
"MySQL의 `LOAD DATA` 명령어를 활용해 대용량 데이터를 빠르게 삽입하는 방법을 소개합니다.
6-
\ 이 명령어는 텍스트 파일에서 데이터를 읽어와 테이블에 신속하게 삽입하며, 일반적인 `INSERT`보다 약 20배 빠른 성능을 제공합니다.
6+
\ 이 명령어는 텍스트 파일에서 데이터를 읽어와 테이블에 신속하게 삽입하며, 일반적인 `INSERT` 방식보다 더 빠른 성능을 제공합니다.
77
\ Container를 사용해 MySQL 환경을 설정하고, CSV 파일을 통해 데이터를 삽입하는 과정을 설명합니다.
88
\ 이를 통해 대량의 데이터를 효율적으로 처리할 수 있음을 확인했습니다."
99
categories:
@@ -12,6 +12,8 @@ categories:
1212
tags:
1313
- "MySQL"
1414
- "LOAD DATA"
15+
- "LOAD"
16+
- "적재"
1517
- "대용량"
1618
- "INSERT"
1719
- "BULK INSERT"
@@ -37,7 +39,7 @@ image:
3739

3840
## LOAD DATA 란?
3941

40-
[LOAD DATA](https://dev.mysql.com/doc/refman/8.4/en/load-data.html) 명령어는 텍스트 파일로부터 데이터를 읽어와 테이블에 매우 빠르게 삽입할 수 있다. Real MySQL에서는 그냥 insert 하는 것과 비교하면 약 20배의 성능차를 보여준다고 설명이 나와있다.
42+
[LOAD DATA](https://dev.mysql.com/doc/refman/8.4/en/load-data.html) 명령어는 텍스트 파일로부터 데이터를 읽어와 테이블에 매우 빠르게 삽입할 수 있다. Real MySQL에서는 일반적인 insert 방식보다 최대 약 20배의 성능차를 보여준다고 설명하고 있다.
4143

4244
`LOAD DATA` 는 빠르지만, **단일 스레드** 로 동작한다는 점에 유의하여 사용한다. Real MySQL에서는 여러개의 파일로 분할하여 병렬로 진행하라는 팁을 제공해주었다.
4345

@@ -50,12 +52,41 @@ image:
5052
실제 운영 환경과 동일하게 맞추기 위해 `MySQL 8.0.32` 버전으로 테스트를 진행하였다.
5153

5254
```sh
53-
podman run -dit -e MYSQL_ROOT_PASSWORD=testtesttesttest -e MYSQL_DATABASE=test -p 3306:3306 --name local-mysql mysql:8.0.32
55+
podman run -dit -e MYSQL_ROOT_PASSWORD=testtesttesttest -e MYSQL_DATABASE=test -p 3306:3306 --name local-mysql mysql:8.0.32 --innodb-buffer-pool-size=12GB
56+
```
57+
58+
버퍼풀 사이즈는 메모리의 50~75% 정도를 할당해주는 것이 좋다. 이 글에서는 컨테이너에 16GB 메모리를 할당하였기 때문에 버퍼 풀 사이즈를 12GB로 설정하였다.
59+
60+
#### 버퍼풀 사이즈 확인 및 설정 방법
61+
62+
현재 설정된 버퍼풀 사이즈는 아래 SQL로 확인할 수 있다.
63+
64+
```SQL
65+
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
66+
```
67+
68+
버퍼풀 사이즈 설정은 위에서 한것과 같이 mysql 을 실행할 때 옵션값을 전달해주거나, (서버 실행중 유지)
69+
70+
```sh
71+
$> mysqld --innodb-buffer-pool-size=12GB
72+
```
73+
74+
SET 문을 통해서 설정하거나, (서버 실행중 유지)
75+
76+
```SQL
77+
SET GLOBAL innodb_buffer_pool_size=12884901888; -- 12gb
78+
```
79+
80+
my.ini 파일을 통해서 설정할 수 있다. (영구 유지)
81+
82+
```ini
83+
[mysqld]
84+
innodb_buffer_pool_size=12884901888 # 12gb
5485
```
5586

5687
### 데이터 세팅
5788

58-
간단한 자바코드를 작성하여 파일로 csv 파일을 생성하도록 하였다. 컬럼 헤더는 csv에 담지 않았다. [faker](https://github.com/DiUS/java-faker) 를 이용하여 어느 정도 랜덤한 있는 데이터가 나올 수 있도록 하였다. 테스트 데이터도 최대한 실제와 유사하기 위해 암호화도 적용하여 데이터를 생성하게 하였다.
89+
간단한 자바코드를 작성하여 파일로 csv 파일을 생성하도록 하였다. csv 파일에는 컬럼 헤더를 포함하지 않았다. [faker](https://github.com/DiUS/java-faker) 를 이용하여 어느 정도 랜덤한 있는 데이터가 나올 수 있도록 하였다. 실제 데이터와 유사성을 높이기 위해 일부 필드에 암호화를 적용해 생성했다.
5990

6091
```
6192
USER0000001,7426C09FB3...,Rob,Gerlach,47a7e9bd9...,251FE112...,10,\N,10,\N,\N,N,0,40,...
@@ -93,21 +124,27 @@ LINES TERMINATED BY '\n' -- 줄 바꿈 문자 (Unix/Linux 기준)
93124

94125
### 테스트 1 : INSERT 와 LOAD DATA 간의 소요시간 비교 (작성중)
95126

127+
`INSERT``LOAD DATA` 의 속도는 얼마나 차이날까? 실제로 Real MySQL 에서 이야기 한대로 20배 정도 차이날까? 이를 알아보기 위해 다음과 같이 테스트를 진행하였다.
128+
96129
실행 환경은 다음과 같다.
97130

98131
- 데이터는 **400만개** 로 고정
99-
- `vCPU 16`, `메모리 16GB` 할당으로 고정
132+
- `vCPU 12`, `메모리 16GB` 할당으로 고정
100133
- 실행을 마친 후에는 table 을 truncate 한 후, container를 재실행
134+
- INSERT 의 경우에는 INSERT VALUES 문을 사용하였다.
135+
101136

102-
| 방식 | 소요시간 |
103-
| --------- | -------- |
104-
| INSERT | |
105-
| LOAD DATA | |
137+
| 방식 | 소요시간 |
138+
| ------------- | ---------- |
139+
| INSERT VALUES | 16m, 27s |
140+
| LOAD DATA | 4m 10s |
106141

107-
결과 :
142+
결과: Real MySQL 에서 언급한 20배 까지는 아니였지만, 약 4배의 차이가 발생되었다.
108143

109144
### 테스트 2 : vCPU 할당에 따른 소요시간 비교 (작성중)
110145

146+
`LOAD DATA`**단일 스레드** 로 동작한다. 그러면 vCPU 할당이 작업 소요시간에 크게 영향이 없을까? 이를 알아보기 위해 다음과 같이 테스트를 진행하였다.
147+
111148
실행 환경은 다음과 같다.
112149

113150
- 데이터는 **400만개** 로 고정
@@ -116,13 +153,18 @@ LINES TERMINATED BY '\n' -- 줄 바꿈 문자 (Unix/Linux 기준)
116153

117154
| Podman vCPU 할당 | 소요시간 |
118155
| ---------------- | -------- |
119-
| vCPU 2 | |
120-
| vCPU 4 | |
121-
| vCPU 8 | |
122-
| vCPU 16 | |
156+
| vCPU 2 | 4m 25s |
157+
| vCPU 4 | 4m 12s |
158+
| vCPU 8 | 4m 18s |
159+
| vCPU 12 | 4m 10s |
123160

124-
결과 :
161+
결과: `LOAD DATA`는 단일 스레드로 동작하다보니, 실제로 vCPU 할당에 크게 영향을 받지 않는 것을 확인할 수 있었다.
125162

126163
## 마무리 (작성중)
127164

128-
스터디를 하며 배웠던 `LOAD DATA` 를 실제로 사용해보고, 대용량 데이터를 빠르게 삽입할 때 매우 효과적인 방법임을 확인할 수 있었다.
165+
스터디를 하며 배웠던 `LOAD DATA` 를 실제로 사용해보았다.
166+
대용량 데이터를 빠르게 삽입할 때, `LOAD DATA``INSERT` 보다도 더 효과적인 방법임을 확인할 수 있었다.
167+
168+
`LOAD DATA` 는 단일 스레드로 동작하기 때문에 vCPU 할당을 늘려도 처리 속도에는 큰 영향을 미치지 않는다는 것을 직접 확인해 보았다. 다음에 더 큰 데이터를 적재해야할 일이 있다면 파일을 나누어 병렬로 적재하는 전략도 고려를 해봐야겠다.
169+
170+
이 글이 대용량 데이터 적재 작업에 참고가 되길 바란다.

0 commit comments

Comments
 (0)