인덱스를 통해 쿼리 실행계획을 개선하려고 한다.
실제 서비스를 운영하는 DB라고 가정하고 실행계획을 보기 위해 더미데이터 100만개를 각 테이블에 넣어야 했다.
테이블마다 100만개의 더미데이터를 넣는 것은 쉽지 않다. 더미데이터를 생성하고 넣으면서 시도했던 방법을 정리해봤다.
실제 성공한 방법은 방법 6 이다.
방법 1 - mockaroo를 이용해서 데이터를 생성하고 삽입
랜덤 데이터를 자동으로 만들어주는 mockaroo라는 사이트가 있다.
이 사이트를 이용하면 내가 원하는 형태로 랜덤 데이터를 생성할 수 있다.
적절한 Type이 없다면 Regular expression 타입을 고르고 내가 원하는 문자열을 만들 수도 있다.
참고 : Mockaroo - regular-expressions
그러나 무료 버전은 한번에 최대 1,000개의 데이터만 생성할 수 밖에 없다는 단점이 있다.
방법 2 - 엑셀로 랜덤 데이터를 생성하고 insert문을 생성해서 삽입
엑셀 함수를 이용해 랜덤데이터를 생성한 뒤 insert문으로 하나하나 넣는 방법이다.
엑셀 최대 행의 수가 1,048,576이므로 100만개의 랜덤데이터를 한 시트에 생성할 수 있다.
아래 함수들을 주로 이용했다.
INT(RAND() * 10) => 0~9 사이의 난수 생성
INDEX($A$1:$A$5, RANDBETWEEN(1,5)) => A1부터 A5까지의 문자열 중 랜덤으로 하나를 고르는 함수
CONCATENATE => 문자열 조합
이 방법의 단점은 시간이 너무 오래걸린다는 것이다.
row당 0.01초만 잡아도 2시간 46분이 걸린다!
방법 3 - bulk insert를 사용
bulk insert를 사용하면 여러 row를 한번에 넣을 수 있다.
값들을 하나의 insert문 안에서 ,로 구분해서 넣으면 된다.
INSERT INTO table VALUES (1, "hello");
INSERT INTO table VALUES (2, "world");
INSERT INTO table VALUES (3, "!");
// bulk insert
INSERT INTO table VALUES (1, "hello"), (2, "world"), (3, "!");
방법 2에 비해 삽입 시간이 훨씬 빠르지만 직접 쿼리문을 생성해야하는 비용이 여전히 크고 비효율적이라는 단점이 있다.
방법 4 - 엑셀로 랜덤 데이터를 생성하고 mysql workbench에서 wizard import
Mysql workbench에는 외부 csv 파일을 테이블에 넣는 방법이 있다.
db의 테이블을 클릭하고 import wizard를 선택하면 된다.
그러나 이 방법 역시 insert문을 하나씩 실행하기 때문에 시간이 오래 걸린다.
방법 5 - mysql workbench에서 LOAD DATA LOCAL INFILE
Mysql에는 LOAD DATA LOCAL INFILE 구문으로 csv 파일을 빠르게 넣는 방법이 있다.
mysql workbench에서 이 구문을 실행해보았다.
LOAD DATA LOCAL INFILE "/Users/heoyeong-un/Documents/shedule_data3.csv" # 파일 경로 입력
INTO TABLE teatime.schedule
FIELDS TERMINATED BY "," # csv 구분자 입력
LINES TERMINATED BY "\n"
IGNORE 1 ROWS;
이 방법의 단점은 초기 세팅에 시간이 걸린다는 점이다.
아래 에러를 비롯해 여러 에러들이 발생했고, 100만개의 데이터를 실제로 넣으려고 했을 때 mysql 서버로의 커넥션이 자꾸 끊기는 문제가 발생했다.
Error Code: 2068. LOAD DATA LOCAL INFILE file request rejected due to restrictions on access.
방법 6 - 엑셀로 랜덤 데이터를 생성 후 FileZilla로 서버에 직접 csv 파일을 옮겨주어 LOAD DATA LOCAL INFILE 구문 실행
이 방법이 우리가 유일하게 성공했던 방법이다.
mysql이 설치된 우분투 서버로 직접 csv 파일을 옮겨 서버 내부에서 LOAD DATA LOCAL INFILE 구문을 실행했다.
100만개 데이터를 한번에 넣는데 단 1분 30초밖에 걸리지 않았다.
방법 7 - JdbcTemplate을 이용해서 batch insert
가장 성능 좋고 간편한 방법이다.
실제로 사용한 방법은 아니지만, 다른 크루가 사용한 방법 중 가장 시간이 빠르고 효율적인 방법이라 생각한다.
아마 다음에 더미데이터를 넣는다면 이 방법을 사용할 것 같다.
'우아한테크코스' 카테고리의 다른 글
JPA 성능 개선기 1. 쿼리 개수 및 시간 로깅 (0) | 2022.09.28 |
---|---|
Mysql 쿼리최적화 (2) | 2022.09.25 |
[트러블 슈팅] The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. (0) | 2022.09.19 |
Lv2 레벨로그 (0) | 2022.08.31 |
Logging 전략 수립(with Logback) (0) | 2022.08.10 |