테마
Performance 스키마와 sys 스키마
Performance 스키마(Performance Schema)는 MySQL 서버가 쿼리를 실행하며 어디에 시간을 썼는지를 스스로 측정해 performance_schema 데이터베이스의 테이블로 보여 주는 기능이다. 로그 파일을 뒤지지 않고 SELECT로 서버 내부를 들여다볼 수 있다. 이 문서는 무엇이고 무엇을 어떻게 수집하는지를, 2는 수집 결과가 쌓이는 테이블을, 3은 sys 스키마(sys schema)로 실무 문제를 찾는 법을 다룬다.
무엇이고 왜 쓰나
쿼리가 느릴 때 "어느 쿼리가 느린가"는 슬로우 쿼리 로그(slow query log)로 찾을 수 있다(MySQL 로그 파일 참고). 하지만 슬로우 쿼리 로그는 기준 시간을 넘긴 쿼리를 한 건씩 파일에 적을 뿐이다. 짧지만 초당 수천 번 도는 쿼리나, 쿼리가 잠금이나 디스크 I/O(Input/Output, 입출력)를 기다린 시간은 보여 주지 않는다. Performance 스키마는 서버 코드 곳곳에 심어 둔 측정 지점에서 시간을 잰다. 그리고 WHERE id = 1과 WHERE id = 2처럼 상수 값만 다르고 구조가 같은 쿼리를 한 묶음으로 보고, 묶음마다 실행 횟수와 시간 합계를 내 둔다.
MySQL 8.4 매뉴얼이 밝히는 성격은 다음과 같다.
- 기본으로 켜져 있다.
performance_schema시스템 변수(system variable)가ON이다. - 메모리에만 있다.
PERFORMANCE_SCHEMA라는 전용 스토리지 엔진(storage engine)으로 구현되어 디스크에 저장하지 않는다. 서버를 재시작하면 내용이 사라지고, 바이너리 로그(binary log)에 기록되지도 않고 복제(replication)되지도 않는다. 서버마다 따로 본다. - 서버 동작을 바꾸지 않는다. 켜도 서버가 스레드를 실행하는 순서(스레드 스케줄링)나 실행 계획(execution plan)이 달라지지 않으며, 수집 과정에 문제가 생겨도 서버는 계속 돈다.
수집 설정: 인스트루먼트와 컨슈머
수집은 두 스위치로 조절한다. 인스트루먼트(instrument)는 서버 코드 안의 측정 지점이고, 컨슈머(consumer)는 측정한 결과를 어느 테이블에 쌓을지다. 둘 다 켜져 있어야 결과가 테이블에 남는다. 두 스위치는 setup_instruments·setup_consumers 같은 setup_ 테이블에 있고, UPDATE로 서버를 재시작하지 않고 바꾼다.
인스트루먼트 이름은 /로 나눈 계층이고, 앞부분이 종류를 알려 준다. 문장(statement) 하나는 실행되며 테이블 열기·정렬·결과 보내기 같은 처리 단계(stage)를 거치므로, 단계를 보면 문장 안의 어느 구간이 오래 걸렸는지 알 수 있다. 대기 쪽에는 뮤텍스(mutex) 대기와 메타데이터 락(metadata lock) 대기 같은 것이 있다. 뮤텍스는 스레드 여러 개가 같은 자원을 동시에 건드리지 못하게 막는 서버 내부 잠금이고, 메타데이터 락은 쿼리가 쓰고 있는 테이블의 구조가 도중에 바뀌지 않게 지키는 잠금이다.
| 이름 예 | 측정 대상 |
|---|---|
statement/sql/select | SQL 문장 실행 |
stage/innodb/alter table (merge sort) | 문장 안의 처리 단계 |
wait/io/file/..., wait/synch/mutex/... | 파일 I/O·뮤텍스 같은 대기 |
wait/lock/metadata/sql/mdl | 메타데이터 락 대기 |
memory/sql/... | 메모리 할당 |
MySQL 8.4 기본 설정에서 문장 인스트루먼트는 모두 켜져 있고, 컨슈머도 여러 개가 켜져 있다. events_statements_current는 스레드마다 지금 실행 중인 문장을, events_statements_history는 스레드마다 최근 문장 몇 건을, statements_digest는 같은 모양 문장의 합계를 쌓는다. 트랜잭션(transaction)용 events_transactions_current·events_transactions_history도 켜져 있다. 메타데이터 락 인스트루먼트와 메모리 인스트루먼트도 기본으로 켜져 있다. 반면 단계(stage) 컨슈머는 기본으로 꺼져 있다. 문장마다 단계 기록이 여러 개 생겨 측정 부담과 메모리가 늘 수 있으므로 필요할 때만 잠깐 켠다.
sql
-- 단계 측정을 잠깐 켠다(재시작하면 기본값으로 돌아간다)
UPDATE performance_schema.setup_consumers
SET ENABLED = 'YES' WHERE NAME LIKE 'events_stages%';특정 사용자만 수집하는 setup_actors, 특정 테이블만 수집하는 setup_objects 같은 필터 테이블도 있다. 수집 범위를 좁히면 측정 부담이 줄고 보고 싶은 대상만 결과에 남는다.
이어지는 내용은 Performance 스키마와 sys 스키마 2에서 다룬다.
면접 포인트
- "Performance 스키마가 뭔가요?" → 서버 내부 동작(문장·단계·대기·메모리)을 측정해 메모리 테이블로 보여 주는 기능. 기본 ON, 재시작하면 사라지고 복제되지 않음.
- 인스트루먼트(측정 지점) + 컨슈머(저장할 테이블) 둘 다 켜야 쌓인다.
setup_테이블로 실행 중에 바꾼다. - 슬로우 쿼리 로그와 차이: 기준 넘은 쿼리 한 건씩 파일 vs 모든 문장을 측정해 같은 모양끼리 합계.
