MySQL 더미데이터 생성

이명우·2023년 11월 16일
1

쿼리 튜닝, MySQL

목록 보기
2/15

RDBMS 관련된 실습을 진행하기 위해 더미데이터를 만드려고 합니다. DB, MySQL 관련 실습하는데 필요하신 분들이나 더미데이터 필요한데 시간 아끼고 싶은 분들은 그대로 가져다 쓰시면 될 것 같습니다.

기본 테이블 생성 및 테이블간 제약관계만 생성하고 인덱싱같은 부분들은 고려를 안했습니다.(실행 계획 뜯어서 인덱스 걸고 개선하는 실습도 하기 위함)

ERD

평범한 커뮤니티를 생각하고 설계한 ERD입니다.


데이터 생성

스키마 생성 + 사용

CREATE DATABASE IF NOT EXISTS community;
USE community;

테이블 생성

순서대로 Ctrl C+V 하고 실행하면 생성됩니다.

CREATE TABLE IF NOT EXISTS USER (
    id BIGINT NOT NULL AUTO_INCREMENT,
    password VARCHAR(255) NOT NULL,
    age BIGINT NOT NULL,
    nickname VARCHAR(25) NOT NULL,
    gender VARCHAR(25) NOT NULL,
    PRIMARY KEY (id)
);

CREATE TABLE IF NOT EXISTS CATEGORY (
    id BIGINT NOT NULL AUTO_INCREMENT,
    category_name VARCHAR(255) NOT NULL,
    PRIMARY KEY (id)
);
CREATE TABLE IF NOT EXISTS POST (
    id BIGINT NOT NULL AUTO_INCREMENT,
    user BIGINT NOT NULL,
    category BIGINT NOT NULL,
    title VARCHAR(255) NOT NULL,
    content TEXT NOT NULL,
    createdAt DATETIME NOT NULL,
    PRIMARY KEY (id),
    FOREIGN KEY (user) REFERENCES USER(id),
    FOREIGN KEY (category) REFERENCES CATEGORY(id)
);

CREATE TABLE IF NOT EXISTS COMMENT (
    user BIGINT NOT NULL,
    post BIGINT NOT NULL,
    content VARCHAR(255) NOT NULL,
    createdAt DATETIME NOT NULL,
    FOREIGN KEY (user) REFERENCES USER(id),
    FOREIGN KEY (post) REFERENCES POST(id)
);

더미데이터 삽입

삽입할 row 개수

USER : 10000 rows
CATEGORY : 10 rows
POST : 100000 rows
COMMENT : 2000000 rows


1. 아무런 제약조건이 걸려있지 않은 USERCATEGORY 테이블부터 더미데이터를 생성

DELIMITER $$

DROP PROCEDURE IF EXISTS insertDummyData$$

CREATE PROCEDURE insertDummyData()
BEGIN
    DECLARE i INT DEFAULT 1;
    DECLARE randGender VARCHAR(5);
    DECLARE randNickname VARCHAR(255);
    
    -- USER 테이블에 더미 데이터 삽입
    WHILE i <= 10000 DO
        -- 남성 또는 여성 성별 랜덤하게 설정
        IF RAND() < 0.5 THEN
            SET randGender = 'MEN';
        ELSE
            SET randGender = 'WOMEN';
        END IF;
        
        -- 랜덤 닉네임 생성
        SET randNickname = CONCAT('User', LPAD(FLOOR(RAND()*1000000), 6, '0'));

        INSERT INTO USER (password, age, gender, nickname) VALUES (CONCAT('pass', FLOOR(RAND()*1000000)), FLOOR(RAND()*82)+18, randGender, randNickname);
        SET i = i + 1;
    END WHILE;
    
    SET i = 1;
    
    -- CATEGORY 테이블에 더미 데이터 삽입
    WHILE i <= 10 DO
        INSERT INTO CATEGORY (category_name) VALUES (CONCAT('category ', i));
        SET i = i + 1;
    END WHILE;
END$$

DELIMITER ;

-- 프로시저 호출
CALL insertDummyData();

COUNT문으로 의도한 개수만큼 데이터가 생성되었는지 확인

SELECT count(*) from user;

SELECT count(*) from category;


2. CATEGORY와 USER 제약 조건이 걸려있는 POST 테이블에 더미데이터를 생성

Post 더미데이터

DELIMITER $$

DROP PROCEDURE IF EXISTS insertPostDummyData$$

CREATE PROCEDURE insertPostDummyData()
BEGIN
    DECLARE i INT DEFAULT 1;
    DECLARE randomUser INT;
    DECLARE randomCategory INT;
    DECLARE randomTitle VARCHAR(255);
    DECLARE randomContent TEXT;

    -- POST 테이블에 더미 데이터 삽입
    WHILE i <= 100000 DO
        -- 유저 ID와 카테고리 ID를 랜덤으로 설정
        SET randomUser = FLOOR(RAND() * (10000 - 1 + 1)) + 1;
        SET randomCategory = FLOOR(RAND() * 10) + 1;

        -- 랜덤 타이틀과 컨텐츠 생성
        SET randomTitle = CONCAT('Title ', LPAD(i, 5, '0'));
        SET randomContent = CONCAT('Content for post ', LPAD(i, 5, '0'));

        INSERT INTO POST (user, category, title, content, createdAt) 
        VALUES (randomUser, randomCategory, randomTitle, randomContent, NOW());
        SET i = i + 1;
    END WHILE;
END$$

DELIMITER ;

-- 스토어드 프로시저 호출useruser
CALL insertPostDummyData();

COUNT문으로 의도한 개수만큼 데이터가 생성되었는지 확인

SELECT count(*) from post;


3. USER, POST 제약 조건이 걸려있는 COMMENT 테이블에 더미데이터를 생성


DROP PROCEDURE IF EXISTS insertCommentDummyData;

DELIMITER $$
CREATE PROCEDURE insertCommentDummyData()
BEGIN
    DECLARE i INT DEFAULT 1;
    DECLARE randomUser BIGINT;
    DECLARE randomPost BIGINT;
    DECLARE randomContent VARCHAR(255);
    DECLARE randomCreatedAt DATETIME;

    WHILE i <= 2000000 DO
        -- User ID와 Post ID를 랜덤으로 생성
        SET randomUser = FLOOR(RAND() * (10000 - 1 + 1)) + 1;
        SET randomPost = FLOOR(RAND() * (100000 - 1 + 1)) + 1;

        -- 랜덤 컨텐트 생성
        SET randomContent = CONCAT('Comment ', LPAD(i, 5, '0'));

        -- 랜덤 createdAt 생성 (2023년 1월 1일부터 2023년 10월 31일 사이)
        SET randomCreatedAt = ADDDATE('2023-01-01', FLOOR(RAND() * (304))); -- 2023년은 365일 중 304일이 10월 31일까지임

        -- 데이터 삽입
        INSERT INTO COMMENT (user, post, content, createdAt)
        VALUES (randomUser, randomPost, randomContent, randomCreatedAt);

        SET i = i + 1;
    END WHILE;
END$$
DELIMITER ;

-- 스토어드 프로시저 호출
CALL insertCommentDummyData();

COUNT문으로 의도한 개수만큼 데이터가 생성되었는지 확인

profile
백엔드 개발자

0개의 댓글