프로젝트를 진행하면서 대용량 데이터에 대한 고민이 생겼습니다.
그리하여 대용량 데이터가 필요하였습니다.
이 페이지에서는 대용량 데이터를 위한 더미데이터 준비과정을 기록하겠습니다.
다음의 내용은 MySQL 기준으로 작성하였습니다.
더미데이터를 준비하기 위하여 프로시저를 사용해야합니다.
프로시저에 대해서 먼저 알아봅시다.
프로시저는 RDBMS에서 다수의 쿼리를 하나의 함수처럼 실행하기위한 쿼리의 집합입니다. 쉘스크립트와 아주 비슷하다고 생각이 듭니다.
show procedure status;
해당 명령어를 입력하면 여러가지의 프로시저가 나옵니다.
먼저 예시를 살펴봅시다.
DELIMITER $$
CREATE PROCEDURE <생성할 프로시저 이름>(
IN <파라미터명> <타입>,
IN <파라미터명> <타입>,
OUT <파라미터명> <반환 타입>
)
BEGIN
DECLARE <변수명> <타입> <기타 옵션>;
# 중략... 다른 쿼리 명령문
END $$
DELIMITER ;
위의 내용은 프로시저를 생성하는 내용입니다.
하나씩 읽어가면서 뜻을 알아봅시다.
프로시저 내부에 존재하는 쿼리 명령문은 " ; "로 끝납니다. 이로 인해서 쿼리가 실행되버리면 안되기 때문에 해당 DELIMETER 속에 존재하는 내용은 실행되지 않도록 막기 위한 명령어라고 생각하시면 됩니다.
프로시저나 트리거에서 사용됩니다.
❗️ 그 외 명령어가 많습니다. 필요 시, 찾아서 프로시저를 생성하여야 합니다.
저의 목표는 프로시저를 이용해서 현재 테이블에 더미 데이터를 넣는 것입니다.
더미 데이터를 넣기 전에 테이블 구조가 어떤지, 어떤 더미데이터가 필요한지 먼저 살펴보겠습니다.
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;
다음의 sql 명령으로 데이터를 확인하였습니다.
# 게시 글 개수 조회
select count(*), city from board group by city;
# 게시 글 100개 조회
select * from board limit 100;
# 회원 수 조회
select count(*) from member;
# 회원 100명 조회
select * from member limit 100;
정상적으로 데이터가 삽입된 것을 볼 수 있습니다.