MySQL에서 데이터베이스의 읽기(read)와 쓰기(write) 비율을 파악하면 쿼리 튜닝, 인덱스 설계, 서버 용량 계획 등에 큰 도움이 됩니다. 이를 확인하는 가장 기본적인 방법은 SHOW STATUS 명령어를 사용하는 것이며, 이 명령어는 서버에서 실행된 모든 SQL 문의 누적 횟수를 상태 변수(status variable) 형태로 보여 줍니다.
1. 전체 명령 통계 조회하기
Com_로 시작하는 모든 상태 변수를 한 번에 확인하려면 다음 구문을 사용합니다.
SHOW STATUS LIKE 'Com_%';
이 쿼리 하나로 SELECT, INSERT, UPDATE, DELETE뿐 아니라 CREATE TABLE, ALTER TABLE 등 서버에서 실행된 거의 모든 명령의 횟수를 확인할 수 있습니다.
2. SELECT·INSERT·UPDATE·DELETE 비율만 조회하기
읽기/쓰기 분석에 핵심이 되는 네 가지 DML 명령의 실행 횟수만 골라서 보고 싶다면 아래 구문을 사용하세요.
SHOW GLOBAL STATUS
WHERE Variable_name = 'Com_insert'
OR Variable_name = 'Com_select'
OR Variable_name = 'Com_update'
OR Variable_name = 'Com_delete';
실제 실행 예시와 출력 결과는 다음과 같습니다.
mysql> SHOW GLOBAL STATUS
-> WHERE Variable_name = 'Com_insert'
-> OR Variable_name = 'Com_select'
-> OR Variable_name = 'Com_update'
-> OR Variable_name = 'Com_delete';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_delete | 5 |
| Com_insert | 340 |
| Com_select | 286 |
| Com_update | 13 |
+---------------+-------+
4 rows in set (0.00 sec)
3. 결과 해석하기
위 결과를 바탕으로 읽기/쓰기 비율을 계산해 보겠습니다.
- 읽기(Read): Com_select = 286회
- 쓰기(Write): Com_insert(340) + Com_update(13) + Com_delete(5) = 358회
전체 작업 644건 중 읽기가 약 44%, 쓰기가 약 56%를 차지하므로, 이 서버는 쓰기 작업이 다소 많은 워크로드라고 할 수 있습니다. 반대로 Com_select의 비중이 훨씬 높다면 읽기 위주 서비스이므로 인덱스 최적화나 읽기 전용 복제 서버(replica) 확장이 효과적일 수 있습니다.
4. SHOW STATUS LIKE 'Com_%' 실행 결과 예시
SHOW STATUS LIKE 'Com_%'를 실행하면 168개에 달하는 변수가 출력되며, 그중 값이 0이 아닌 주요 항목은 다음과 같습니다.
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| Com_change_db | 1 |
| Com_create_table | 6 |
| Com_insert | 42 |
| Com_select | 27 |
| Com_set_option | 3 |
| Com_show_status | 3 |
| Com_show_variables | 2 |
+--------------------+-------+
168 rows in set (0.04 sec)
대부분의 변수는 해당 명령이 한 번도 실행되지 않아 0으로 표시되며, 실제로 사용된 명령만 0보다 큰 값을 가집니다.
5. 알아두면 좋은 팁
- 세션 vs 글로벌:
SHOW STATUS는 현재 세션 기준,SHOW GLOBAL STATUS는 서버 전체(모든 연결의 누적값) 기준입니다. - 초기화 시점: 상태 변수 값은 서버가 재시작되면 0부터 다시 누적됩니다.
- 변수 이름 표기: 조건 비교 시 대소문자를 일관되게 맞추는 것이 안전합니다(예: 'Com_update').
- 추가 분석: MySQL 8.0에서는 performance_schema의
events_statements_summary_global_by_event_name테이블을 활용하면 더욱 상세한 문(statement)별 통계를 얻을 수 있습니다.