프로시저)
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 ;
실무 환경에서도 충분히 확장 가능한 구조라고 판단
실제 서비스 환경에서도 이 구조를 기반으로 데이터 증가 시 샤딩·파티셔닝 등으로 확장 적용 가능
5000만 건 이상의 로그 데이터로 인한 DB 과부하에 대비해, GZIP 압축 및 장기 보관 방식도 함께 고려할 수 있음
📎 데이터 삽입 중 발생한 실제 문제와 해결 과정