공부해봅시당

[성능 테스트] 성능테스트를 위한 준비 - MYSQL에 프로시저로 더미 데이터 넣기 본문

STUDY/개발 고민

[성능 테스트] 성능테스트를 위한 준비 - MYSQL에 프로시저로 더미 데이터 넣기

tngus 2023. 10. 17. 14:22

아래 링크를 참고하여 작성된 글입니다.

https://velog.io/@sileeee/MYSQL-%EB%8D%94%EB%AF%B8-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%84%A3%EA%B8%B0

 

MYSQL 더미 데이터 넣기

성능 테스트를 진행하기 전, 좀 더 유의미한 테스트를 진행하기 위한 방법으로 가짜 데이터인 `더미테이터`를 DB에 넣어보았습니다.

velog.io

 

성능테스트 시작 전

대용량 트래픽이 발생하는 채팅 서버를 개발하며 성능 테스트에 대한 필요성을 느끼게 됨

그 전에, 유의미한 테스트를 진행하기 위해 더미데이터를 DB에 넣기로 결정함

특히 현재 진행 중인 로직 상에서 채팅 전송 및 조회, 채팅방 조회에서 병목 형상이 발생할 가능성이 있다고 판단되어 해당 부분에 대한 성능 테스트를 집중적으로 진행할 예정

 

실행환경

여기에서는 DBeaver로 진행

 

디스크 용량 확인

더미데이터 삽입 전, 현재 사용중인 DB의 용량을 확인해야 함

용량을 넘어서지 않으면서, 충분한 양의 데이터를 넣기 위해서라고 함

전체 용량 확인

아래 MYSQL 스크립트를 그대로 입력하면 사용 중인 DB의 메모리(used_MB)사용 가능한 DB의 메모리(free_MB)를 알 수 있음

SELECT 
	SUM(data_length+index_length)/1024/1024 "used_MB", 
	SUM(data_free)/1024/1024 "free_MB"
FROM
	information_schema.tables;

 

database 별 용량 확인

SELECT 
	table_schema "Database", 
	ROUND(SUM(data_length+index_length)/1024/1024,1) "used_MB" 
FROM 
	information_schema.TABLES 
GROUP BY 1;

데이터베이스 별로 사용 중인 DB용량을 알 수 있음

프로젝트에 사용되는 userdb 데이터베이스는 현재까지 약 0.4MB만큼 사용 중

 

현재 userdb 데이터베이스에 존재하는 table은 아래와 같음

flyway_schema_history는 spring boot에 적용한 데이터베이스 마이그레이션 툴이므로 현재 성능 테스트를 위한 테이블은 아님

 

현재, 가장 중요한 테이블은 아래 두 가지 종류임

1. 채팅 메시지를 보내는 주체가 되는 테이블: account

2. 채팅과 관련된 정보가 담기는 테이블

       1) 핵심: chatting_room(채팅방), chatting_pariticipant(채팅 참가자), chatting_message(채팅 메시지)

      2) 추가: chatting_message_bookmark(채팅 메시지 북마크), top_chatting_room(채팅방 상단고정)

 

여기서 5만개 이상의 데이터가 담기는 테이블은 chatting_message 테이블인데, 연관관계가 있는 테이블이 있어 미리 의미 있는 데이터를 담고, chatting_message 테이블에 5만개 데이터를 삽입하기로 결정

 

채팅 메시지에 5만개 데이터 삽입 전 준비과정

1. account 테이블에 데이터 삽입

위에서 account 테이블의 데이터가 존재해야 아래 채팅과 관련된 정보가 담기는 테이블에 데이터를 삽입할 수 있기 때문에 먼저 account 테이블에 데이터를 삽입하기로 함

 

이 데이터는 직접 각각의 정보를 담은 27개의 데이터를 사용하여 insert함

 

2. 채팅방과 채팅참여자 정보 insert

이후 채팅방과 채팅방에 대한 참여자 데이터를 임의로 생성하여 insert 함

 

채팅메시지에 5만개 더미데이터 넣기

더미데이터를 넣는 여러 방법 중, 프로시저와 mockaroo를 이용하여 생성해보려고 함

 

데이터 삽입 전 사용 중인 용량

 

프로시저를 사용해 5만개의 채팅 데이터 삽입

5만개 채팅 메시지 삽입 시, 채팅 메시지를 보내면 안 읽은 채팅 메시지를 1개씩 증가시키는 로직이 있기 때문에 chatting_participant 테이블의 not_view_count까지 함께 1씩 update 시켜줌

DELIMITER $$
DROP PROCEDURE IF EXISTS insertLoop$$
 
CREATE PROCEDURE insertLoop()
BEGIN
    DECLARE i INT DEFAULT 1;
    WHILE i <= 50000 DO
        INSERT INTO userdb.chatting_message(chatting_message_id, chatting_room, account, content, file_url, not_view_count, is_edited, is_deleted, created_at)
				VALUES (i, 1, 1, concat('content',i), '', i, false, false, now());
		UPDATE userdb.chatting_participant SET not_view_count = i WHERE account_id = 13;
        SET i = i + 1;
    END WHILE;
END$$
DELIMITER $$

CALL insertLoop;
$$

삽입하면 아래와 같이 5만개의 데이터가 삽입되고, 읽지 않은 채팅 메시지도 5만개로 update됨

 

chatting_message 테이블 데이터의 일부

chatting_participant 테이블의 안 읽은 채팅 메시지 update 5만개 확인

데이터 삽입 후 사용 중인 용량

바뀌어야 할 것 같은데 그대로다... 다시 5만개 데이터 추가 삽입

10만개 데이터가 잘 삽입됨

 

그런데 여전히 데이터 용량은 그대로... 

다시 10만개 추가해보자

10만개 추가 후 새로고침 할 때마다 chatting_participant의 not_view_count가 실시간으로 증가하는걸 볼 수 있음

 

우와... 여전히 똑같다

20만개를 넣었는데 똑같다니....

 

100만개로 늘려보자

 

왜 여전히 같을까

 

du 명령어로 다시 시도

https://zetawiki.com/wiki/MySQL_%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4_%EC%9A%A9%EB%9F%89_%ED%99%95%EC%9D%B8

 

MySQL 데이터베이스 용량 확인 - 제타위키

 

zetawiki.com

docker로 올렸던 mysql에 접속하여 직접 명령어를 쳐보자

아래 명령어 치면 userdb가 1.5M

du -h /var/lib/mysql

 

100만 데이터 추가 후 다시 치면 userdb가 90M

여기서 mysql에 접속하여 이전에 쳤던 명령어를 다시 쳐보면?

 

똑같다.....

 

혹시 이유를 아시는 분 말씀 부탁드립니다

 

 

일단 프로시저로 채팅 데이터를 잘 삽입했으니 다음으로 mockaroo로 진행해보도록 하자

mockaroo는 다음 포스팅에서 진행하도록 하겠다