새 쿼리는 배포 전 실행 계획 검토, 인덱스 추가, 고치는 쿼리(UPDATE·DELETE)도 인덱스를 타는지 확인.
인프라팀 할 일
느린 쿼리 로그 감시, 풀 스캔 쿼리를 찾아 게임팀에 공유, 운영 중 인덱스 추가는 잠금이 짧은 온라인 방식으로 적용.
수치 감각
인덱스가 있으면 수 ms, 없으면 데이터 크기에 비례해 느려져 큰 테이블에서는 수백~수만 배.
그래프에서는
어느 순간부터 계단처럼 올라감 · DB 쿼리 지연, 읽은 행 수
확인할 곳
MySQL은 slow query log(log_queries_not_using_indexes를 켜면 인덱스를 안 쓴 쿼리도 기록)의 Rows_examined·Rows_sent, performance_schema events_statements_summary_by_digest의 SUM_NO_INDEX_USED·SUM_ROWS_EXAMINED를 보고 EXPLAIN을 돌림. PostgreSQL은 pg_stat_user_tables의 seq_scan·seq_tup_read를 보고 EXPLAIN을 돌림
이러면 맞음
배포 뒤 새로 나타난 쿼리가 돌려준 행(Rows_sent)보다 수천 배 많은 행을 읽고(Rows_examined), EXPLAIN에 테이블 전체 스캔(MySQL type ALL, PostgreSQL Seq Scan)이 나옴. 큰 테이블의 seq_tup_read가 배포 시각부터 가파르게 늘어남
이러면 아님
인덱스를 타는데도 느리면 잠금 대기(db-hot-row, db-ddl-lock)나 실행 계획 변경(db-plan-flip). 작은 테이블의 전체 스캔은 정상일 수 있음
확인 수단
인프라 도구로 확인(게임 코드 불필요)
더 알아보기
인덱스가 없으면 쓰기도 영향을 받습니다. 인덱스 없이 고치는 쿼리(UPDATE·DELETE)는 DB에 따라 스캔한 행까지 잠가 상관없는 플레이어의 저장까지 막을 수 있습니다.