MySQL 주니어 트러블슈팅 기술면접

MySQL 주니어 (1~3년) 트러블슈팅 3문항 조회수 25 · 2026-08-07 (금) 12:10:46
1 쿼리 성능 장애
Medium

Q. 운영 중인 서비스에서 특정 시간대에 사용자 목록 조회 API가 평소 0.5초에서 갑자기 30초 이상 걸리는 현상이 발생했습니다. users 테이블에는 100만 건의 데이터가 있고, WHERE status = 'active' 조건으로 조회하는 쿼리입니다. 어떤 순서로 원인을 분석하고 해결하시겠습니까?

쿼리 실행 계획을 확인하고 인덱스 존재 여부를 먼저 점검해보세요.

A. 모범답안

먼저 SHOW PROCESSLIST로 현재 실행 중인 쿼리를 확인하여 슬로우 쿼리를 식별합니다. 다음으로 EXPLAIN 명령어로 해당 쿼리의 실행 계획을 분석하여 Full Table Scan이 발생하는지 확인합니다. SHOW INDEX FROM users로 status 컬럼에 인덱스가 있는지 확인하고, 없다면 CREATE INDEX idx_status ON users(status)로 인덱스를 생성합니다. 인덱스 생성 후 쿼리 성능을 재측정하고, 슬로우 쿼리 로그를 활성화하여 향후 유사한 문제를 조기에 발견할 수 있도록 모니터링 체계를 구축합니다. 또한 인덱스 생성 시 서비스 영향을 최소화하기 위해 트래픽이 적은 시간대에 작업하거나 ALGORITHM=INPLACE 옵션을 고려합니다.

핵심 포인트
  • SHOW PROCESSLIST와 EXPLAIN으로 원인 진단
  • 인덱스 부재 확인 및 적절한 인덱스 생성
  • 슬로우 쿼리 로그 활성화로 재발 방지
답변에 넣으면 좋은 키워드
EXPLAIN Full Table Scan 인덱스 SHOW PROCESSLIST 슬로우 쿼리 로그 실행 계획
실무에서는

대용량 데이터를 다루는 서비스에서 인덱스 누락으로 인한 성능 저하는 가장 흔한 장애 유형입니다.

Follow-up 질문

status 컬럼에 인덱스를 생성했는데도 성능이 개선되지 않는다면 어떤 추가 원인을 의심해볼 수 있을까요?

2 연결 장애
Medium

Q. 새벽 시간대에 갑자기 애플리케이션에서 'Too many connections' 에러가 발생하면서 신규 사용자 접속이 불가능한 상황이 발생했습니다. 기존 연결된 사용자는 정상 동작하고 있습니다. 즉시 조치해야 할 사항과 근본 원인을 찾기 위한 분석 방법, 그리고 재발 방지 대책을 설명해주세요.

현재 활성 연결 수와 최대 연결 수 설정을 먼저 확인하고, 연결이 제대로 반환되고 있는지 점검하세요.

A. 모범답안

즉시 SHOW VARIABLES LIKE 'max_connections'로 최대 연결 수를 확인하고, SHOW PROCESSLIST로 현재 활성 연결 목록을 조회합니다. 긴급 조치로 SET GLOBAL max_connections=500 같이 최대 연결 수를 임시로 늘려 서비스를 복구합니다. 근본 원인 분석을 위해 SHOW PROCESSLIST에서 Sleep 상태로 오래 유지되는 연결이나 특정 쿼리가 장시간 실행되는지 확인합니다. 애플리케이션 코드에서 커넥션 풀 설정을 검토하고, 연결을 제대로 close하지 않는 코드가 있는지 확인합니다. 재발 방지를 위해 wait_timeout과 interactive_timeout 값을 적절히 설정하고, 커넥션 풀 크기를 적정 수준으로 조정하며, 모니터링 알람을 설정하여 연결 수가 임계치에 도달하면 사전에 알림을 받도록 합니다.

핵심 포인트
  • max_connections 증가로 즉시 서비스 복구
  • SHOW PROCESSLIST로 연결 상태 분석 및 원인 파악
  • 타임아웃 설정과 커넥션 풀 최적화로 재발 방지
답변에 넣으면 좋은 키워드
max_connections SHOW PROCESSLIST 커넥션 풀 wait_timeout Sleep 상태 연결 누수
실무에서는

트래픽 증가나 커넥션 누수로 인한 연결 고갈은 서비스 장애의 주요 원인 중 하나입니다.

Follow-up 질문

커넥션 풀의 적정 크기는 어떻게 결정하시겠습니까?

3 데이터 정합성 장애
Medium

Q. 주문 시스템에서 동시에 여러 사용자가 같은 상품의 재고를 차감하는 과정에서 재고가 마이너스가 되는 문제가 발생했습니다. orders 테이블에 주문이 기록되고 products 테이블의 stock 컬럼을 UPDATE stock = stock - 1 형태로 감소시키는 로직입니다. 이 문제의 원인과 해결 방법을 설명해주세요.

동시성 제어가 되지 않아 발생하는 문제로, 트랜잭션과 락을 활용한 해결 방법을 고려하세요.

A. 모범답안

이 문제는 Race Condition으로 인한 동시성 문제입니다. 여러 트랜잭션이 동시에 재고를 조회하고 업데이트하면서 재고 검증 로직이 제대로 작동하지 않은 것입니다. 해결 방법으로는 첫째, SELECT ... FOR UPDATE를 사용하여 재고 조회 시 배타락을 걸어 다른 트랜잭션의 접근을 차단합니다. 둘째, UPDATE products SET stock = stock - 1 WHERE id = ? AND stock > 0 형태로 조건부 업데이트를 수행하고, affected rows를 확인하여 업데이트 실패 시 재고 부족으로 처리합니다. 셋째, 트랜잭션 격리 수준을 적절히 설정하고 COMMIT 전에 재고가 0 이상인지 재확인하는 로직을 추가합니다. 재발 방지를 위해 재고가 마이너스가 되지 않도록 CHECK 제약조건을 추가하고, 주기적으로 재고 정합성을 검증하는 배치 작업을 운영합니다.

핵심 포인트
  • Race Condition으로 인한 동시성 문제 식별
  • SELECT FOR UPDATE로 배타락 적용
  • 조건부 UPDATE와 affected rows 확인으로 안전한 재고 차감
답변에 넣으면 좋은 키워드
Race Condition SELECT FOR UPDATE 배타락 동시성 제어 트랜잭션 affected rows
실무에서는

재고 관리, 좌석 예약, 포인트 차감 등 동시성 제어가 필요한 모든 비즈니스 로직에서 발생할 수 있는 문제입니다.

Follow-up 질문

SELECT FOR UPDATE 대신 낙관적 락(Optimistic Lock)을 사용할 수도 있는데, 어떤 상황에서 낙관적 락이 더 적합할까요?

댓글 0

로그인 후 댓글을 작성할 수 있습니다.

아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!