상황

의사 결정

구현 방식

  1. 5000만 건 데이터 삽입은 SQL 프로시저 기반 bulk 연산 방식으로 구현

프로시저)

DELIMITER //

CREATE PROCEDURE BulkInsertDailyVideoViews()
BEGIN
    DECLARE batch INT DEFAULT 1;         -- 배치 반복 카운터
    DECLARE batchSize INT DEFAULT 20000; -- 한 번에 삽입할 데이터 크기
    DECLARE totalBatches INT DEFAULT 1;  -- 총 배치 수 
    DECLARE i INT;                       -- 개별 데이터 반복 카운터

    WHILE batch <= totalBatches DO
        SET @bulk_values = ''; -- Bulk Insert용 데이터 초기화
        SET i = 1;

        WHILE i <= batchSize DO
            SET @videoId = FLOOR(1 + (RAND() * 4000)); -- 1~4000 범위의 랜덤 비디오 ID
            SET @randomDate = CURDATE();  -- ✅ 오늘 날짜로 설정 (형식: 'YYYY-MM-DD')
            SET @viewCount = FLOOR(1 + (RAND() * 9)); -- 1~9 랜덤 조회수
            SET @playTime = FLOOR(10 + (RAND() * 90)); -- 10~99 랜덤 재생 시간
            SET @adViewCount = FLOOR(@playTime / 5); -- 광고 조회수
            SET @currentPosition = FLOOR(1 + (RAND() * 200)); -- 1~200 랜덤 위치 값

            -- Bulk Insert용 VALUES 생성
            SET @bulk_values = CONCAT(
                @bulk_values, 
                IF(@bulk_values = '', '', ','), 
                '(', @videoId, ', \\'', @randomDate, '\\', ', @viewCount, ', ', @adViewCount, ', ', @playTime, ', ', @currentPosition, ')'
            );

            SET i = i + 1; -- 데이터 반복 카운터 증가
        END WHILE;

        -- Bulk Insert 실행
        SET @sql = CONCAT(
            'INSERT INTO DailyVideoView (videoid, createdAt, viewcount, adviewcount, playtime, currentposition) VALUES ', 
            @bulk_values
        );
        PREPARE stmt FROM @sql;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;

        -- 상태 출력
        SELECT CONCAT('Batch ', batch, ' inserted successfully') AS status;

        SET batch = batch + 1; -- 배치 반복 카운터 증가
    END WHILE;
END //

DELIMITER ;

결과 및 인사이트