공부해봅시당
[성능 테스트] 성능테스트를 위한 준비 - MYSQL에 프로시저로 더미 데이터 넣기 본문
아래 링크를 참고하여 작성된 글입니다.
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 명령어로 다시 시도
MySQL 데이터베이스 용량 확인 - 제타위키
zetawiki.com
docker로 올렸던 mysql에 접속하여 직접 명령어를 쳐보자
아래 명령어 치면 userdb가 1.5M
du -h /var/lib/mysql
100만 데이터 추가 후 다시 치면 userdb가 90M
여기서 mysql에 접속하여 이전에 쳤던 명령어를 다시 쳐보면?
똑같다.....
혹시 이유를 아시는 분 말씀 부탁드립니다
일단 프로시저로 채팅 데이터를 잘 삽입했으니 다음으로 mockaroo로 진행해보도록 하자
mockaroo는 다음 포스팅에서 진행하도록 하겠다
'STUDY > 개발 고민' 카테고리의 다른 글
[성능 테스트] nGrinder + Springboot 부하 테스트 준비 - groovy 파일로 스크립트 실행해보기 (0) | 2023.11.07 |
---|---|
[성능 테스트] nGrinder + Springboot 부하 테스트 준비 - nGrinder 설치 및 agent 실행 (0) | 2023.10.17 |
[성능 테스트] 성능테스트를 위한 준비 - MYSQL에 Mockaroo로 더미 데이터 넣기2 (0) | 2023.10.17 |
[Spring Boot] Security 7.0 버전업에 의한 Deprecated 문제 (1) | 2023.07.09 |
[Project] mysql, spring-boot, docker-compose 실행 (2) | 2023.07.04 |