[MySql] 더미데이터 생성하기

YoungHo-Cha·2022년 8월 23일
3

Catch Bug Project

목록 보기
7/12
post-thumbnail

Overview

프로젝트를 진행하면서 대용량 데이터에 대한 고민이 생겼습니다.

그리하여 대용량 데이터가 필요하였습니다.

이 페이지에서는 대용량 데이터를 위한 더미데이터 준비과정을 기록하겠습니다.

다음의 내용은 MySQL 기준으로 작성하였습니다.

프로시저란?

더미데이터를 준비하기 위하여 프로시저를 사용해야합니다.

프로시저에 대해서 먼저 알아봅시다.

프로시저는 RDBMS에서 다수의 쿼리를 하나의 함수처럼 실행하기위한 쿼리의 집합입니다. 쉘스크립트와 아주 비슷하다고 생각이 듭니다.

프로시저의 장점

  • 하나의 요청으로 SQL 명령을 여러번 실행할 수 있다.
  • 보수성이 뛰어나다.

프로시저의 단점

  • 코드 자산으로의 재사용성이 나쁘다.
  • 데이터에 대한 내용 변경 시, 프로시저를 변경해야할 가능성이 존재한다.

프로시저 목록 확인법

show procedure status;

해당 명령어를 입력하면 여러가지의 프로시저가 나옵니다.

image

프로시저 정의(생성) 방법

먼저 예시를 살펴봅시다.

DELIMITER $$

CREATE PROCEDURE <생성할 프로시저 이름>(
    IN <파라미터명> <타입>,
    IN <파라미터명> <타입>,
    OUT <파라미터명> <반환 타입>
)
BEGIN
    DECLARE <변수명> <타입> <기타 옵션>;
    # 중략... 다른 쿼리 명령문

END $$
DELIMITER ;

위의 내용은 프로시저를 생성하는 내용입니다.

하나씩 읽어가면서 뜻을 알아봅시다.

DELIMITER $$

  • 프로시저 내부에 존재하는 쿼리 명령문은 " ; "로 끝납니다. 이로 인해서 쿼리가 실행되버리면 안되기 때문에 해당 DELIMETER 속에 존재하는 내용은 실행되지 않도록 막기 위한 명령어라고 생각하시면 됩니다.

  • 프로시저나 트리거에서 사용됩니다.

BEGIN & END

  • BEGIN 과 END 사이에는 수행할 쿼리를 나열해주면 됩니다.

IN

  • 프로시저를 호출 시 파라미터가 필요할 때, "IN"을 사용합니다.

OUT

  • 프로시저의 결과값이 필요한 경우 "OUT"을 사용합니다.

DECLARE

  • 변수의 선언이 필요한 경우에 사용합니다.

❗️ 그 외 명령어가 많습니다. 필요 시, 찾아서 프로시저를 생성하여야 합니다.

더미데이터 생성하기

저의 목표는 프로시저를 이용해서 현재 테이블에 더미 데이터를 넣는 것입니다.

더미 데이터를 넣기 전에 테이블 구조가 어떤지, 어떤 더미데이터가 필요한지 먼저 살펴보겠습니다.

ERD

image

member와 board는 1:N 관계를 이루고 있습니다.

대용량이될 데이터

대용량이될 데이터는 member와 board가 될 것입니다.

그럼 프로시저를 만들어봐요!

프로시저 생성

DELIMITER $$

DROP PROCEDURE IF EXISTS insertDummyData$$
 
CREATE PROCEDURE insertDummyData()
BEGIN
    DECLARE i INT DEFAULT 1;
        
    WHILE i <= 10000000 DO
        INSERT INTO member(id, gender, kakao_id, nickname)
          VALUES(i, 'MALE', i, concat('닉네임', i));
		
	  IF i <= 1000000 THEN
            INSERT INTO board(id, created_time, city, board_content, detail_location, latitude, longitude, region, board_title,  town, host_id)
          VALUES(i, now(), '창원시 의창구', concat('내용', i), concat('상세주소', i), 1.111 + i, 2.222 + i, '경상남도', concat('제목', i), '상남동', i);
          
	  ELSEIF (i<= 3000000 AND i >= 1000001) THEN
            INSERT INTO board(id, created_time, city, board_content, detail_location, latitude, longitude, region, board_title,  town, host_id)
          VALUES(i, now(), '강남구', concat('내용', i), concat('상세주소', i), 1.111 + i, 2.222 + i, '서울특별시', concat('제목', i), '대치동', i);

          ELSEIF (i<= 5000000 AND i >= 3000001) THEN
            INSERT INTO board(id, created_time, city, board_content, detail_location, latitude, longitude, region, board_title,  town, host_id)
          VALUES(i, now(), '강서구', concat('내용', i), concat('상세주소', i), 1.111, 2.222, '서울특별시', concat('제목', i), '화곡', i);

	  ELSEIF (i <= 6000000 AND i>= 5000001) THEN
            INSERT INTO board(id, created_time, city, board_content, detail_location, latitude, longitude, region, board_title,  town, host_id)
          VALUES(i, now(), '창원시 의창구', concat('내용', i), concat('상세주소', i), 1.111 + i, 2.222 + i, '경상남도', concat('제목', i), '상남동', i);
          
	  ELSEIF (i<= 8000000 AND i >= 6000001) THEN
            INSERT INTO board(id, created_time, city, board_content, detail_location, latitude, longitude, region, board_title,  town, host_id)
          VALUES(i, now(), '강남구', concat('내용', i), concat('상세주소', i), 1.111 + i, 2.222 + i, '서울특별시', concat('제목', i), '대치동', i);
	
      
      ELSE
        INSERT INTO board(id, created_time, city, board_content, detail_location, latitude, longitude, region, board_title,  town, host_id)
          VALUES(i, now(), '강서구', concat('내용', i), concat('상세주소', i), 1.111, 2.222, '서울특별시', concat('제목', i), '화곡', i);
	  END IF;
        SET i = i + 1;
	 
    END WHILE;
END$$
DELIMITER $$


CALL insertDummyData;
  • 데이터는 1000만건을 삽입했습니다.
  • 파티셔닝을 할 계획이 있는 region은 중복처리를 하였습니다.
  • 데이터는 다음과 같이 준비하였습니다.
    • 200만 건 : "경상남도 창원시 의창구 상남동"
    • 400만 건 : "서울특별시 강남구 대치동"
    • 400만 건 : "서울특별시 강서구 화곡"

더미데이터 삽입상태 확인하기

다음의 sql 명령으로 데이터를 확인하였습니다.

# 게시 글 개수 조회
select count(*), city from board group by city;
image
# 게시 글 100개 조회
select * from board limit 100;
image
# 회원 수 조회
select count(*) from member;
image
# 회원 100명 조회
select * from member limit 100;
image

정상적으로 데이터가 삽입된 것을 볼 수 있습니다.

profile
관심많은 영호입니다. 궁금한 거 있으시면 다음 익명 카톡으로 말씀해주시면 가능한 도와드리겠습니다! https://open.kakao.com/o/sE6T84kf

0개의 댓글