MySQL 미드레벨 기술면접

MySQL 미드레벨 (3~7년) 종합 5문항 조회수 54 · 2026-07-05 (일) 03:10:57
1 쿼리 최적화
Medium

Q. MySQL에서 WHERE 절에 함수를 사용하면 인덱스를 타지 못하는 경우가 많습니다. 예를 들어 DATE(created_at) = '2024-01-01' 같은 쿼리가 비효율적인 이유를 설명하고, 이를 인덱스를 활용하도록 개선하는 방법을 설명해주세요.

A. 모범답안

WHERE 절에서 컬럼에 함수를 적용하면 인덱스의 정렬 순서를 활용할 수 없어 풀 테이블 스캔이 발생합니다. DATE(created_at) = '2024-01-01'은 모든 행의 created_at 값을 DATE 함수로 변환한 후 비교해야 하므로 인덱스를 사용할 수 없습니다. 이를 개선하려면 created_at >= '2024-01-01 00:00:00' AND created_at < '2024-01-02 00:00:00' 처럼 컬럼을 가공하지 않고 범위 조건으로 변경해야 합니다. 또는 Function-Based Index나 Generated Column을 활용하여 함수 결과값에 대한 인덱스를 생성할 수도 있습니다.

핵심 포인트
  • • 컬럼에 함수 적용 시 인덱스의 B+Tree 정렬 순서를 활용할 수 없음
  • • Sargable(Search ARGument ABLE) 조건으로 변환하여 인덱스 활용
  • • 범위 조건으로 재작성하거나 Generated Column 활용
Follow-up 질문

LIKE '%keyword%'처럼 와일드카드가 앞에 오는 검색 조건은 어떻게 최적화할 수 있을까요? Full-Text Search나 다른 대안을 고려한다면 어떤 방법이 있을까요?

2 트랜잭션 격리
Hard

Q. MySQL InnoDB에서 SELECT ... FOR UPDATE와 SELECT ... FOR SHARE(또는 LOCK IN SHARE MODE)의 차이점을 설명하고, 각각 어떤 상황에서 사용해야 하는지 실무 예시와 함께 설명해주세요.

A. 모범답안

SELECT ... FOR UPDATE는 배타적 잠금(Exclusive Lock)을 획득하여 다른 트랜잭션의 읽기와 쓰기를 모두 차단합니다. SELECT ... FOR SHARE는 공유 잠금(Shared Lock)을 획득하여 다른 트랜잭션의 읽기는 허용하지만 쓰기는 차단합니다. FOR UPDATE는 재고 차감처럼 읽은 후 반드시 수정할 데이터에 사용하며, FOR SHARE는 참조 무결성 검증처럼 읽은 데이터가 변경되지 않아야 하지만 여러 트랜잭션이 동시에 읽을 수 있어야 하는 경우에 사용합니다. FOR SHARE를 사용하면 동시성이 높아지지만, 여러 트랜잭션이 공유 잠금을 획득한 상태에서 배타적 잠금으로 업그레이드하려 할 때 데드락이 발생할 수 있습니다.

핵심 포인트
  • • FOR UPDATE는 배타적 잠금, FOR SHARE는 공유 잠금
  • • FOR UPDATE는 수정 예정 데이터, FOR SHARE는 읽기만 하지만 변경 방지 필요한 경우
  • • FOR SHARE 사용 시 잠금 업그레이드로 인한 데드락 주의
Follow-up 질문

NOWAIT, SKIP LOCKED 옵션을 함께 사용하면 어떤 동작을 하며, 어떤 시나리오에서 유용한지 설명해주세요.

3 스키마 설계
Medium

Q. MySQL에서 1:N 관계를 표현할 때, 부모 테이블에 자식 레코드 개수를 저장하는 카운터 컬럼을 두는 것의 장단점을 설명하고, 카운터 업데이트 시 동시성 문제를 해결하는 방법을 설명해주세요.

A. 모범답안

카운터 컬럼을 두면 COUNT 쿼리 없이 빠르게 개수를 조회할 수 있지만, 자식 레코드 추가/삭제 시마다 부모 테이블을 UPDATE해야 하므로 쓰기 부하가 증가하고 부모 레코드에 잠금 경합이 발생합니다. 또한 애플리케이션 로직에서 카운터를 유지해야 하므로 데이터 불일치 위험이 있습니다. 동시성 문제를 해결하려면 UPDATE parent SET count = count + 1 같은 원자적 증감 연산을 사용하거나, Redis 같은 별도 저장소에서 카운터를 관리하고 주기적으로 동기화하는 방법이 있습니다. 또는 이벤트 기반 아키텍처로 비동기 업데이트를 수행할 수도 있습니다.

핵심 포인트
  • • 조회 성능 향상 vs 쓰기 부하 증가 및 잠금 경합 트레이드오프
  • • 데이터 일관성 유지의 어려움
  • • 원자적 증감 연산, 별도 저장소 활용, 비동기 업데이트 전략
Follow-up 질문

게시글의 조회수나 좋아요 수처럼 정확성이 덜 중요한 카운터와, 주문 건수처럼 정확성이 중요한 카운터를 다르게 설계해야 한다면 어떻게 접근하시겠습니까?

4 리플리케이션
Hard

Q. MySQL 리플리케이션 환경에서 Replication Lag(복제 지연)이 발생하는 주요 원인들을 설명하고, 프로덕션 환경에서 복제 지연을 모니터링하고 해결하는 방법을 설명해주세요.

A. 모범답안

복제 지연의 주요 원인은 Master의 쓰기 부하가 높아 Binary Log가 빠르게 생성되는데 Slave가 Single Thread로 순차 적용하여 따라가지 못하는 경우, Slave에서 무거운 읽기 쿼리가 실행되어 리소스 경합이 발생하는 경우, 네트워크 대역폭 부족, 그리고 대용량 트랜잭션이 있습니다. 모니터링은 SHOW SLAVE STATUS의 Seconds_Behind_Master 값을 확인하거나 Percona Monitoring and Management(PMM) 같은 도구를 사용합니다. 해결 방법으로는 MySQL 5.7 이상에서 Multi-Threaded Slave(병렬 복제)를 활성화하고, Slave를 읽기 전용으로 분리하거나 스케일 아웃하며, 대용량 배치 작업을 작은 단위로 분할하고, 필요시 GTID 기반 복제로 전환하는 방법이 있습니다.

핵심 포인트
  • • Single Thread 복제의 한계, Slave 부하, 네트워크, 대용량 트랜잭션
  • • Seconds_Behind_Master 모니터링
  • • Multi-Threaded Slave, 읽기 부하 분산, 트랜잭션 분할
Follow-up 질문

복제 지연이 발생하는 상황에서 애플리케이션이 방금 쓴 데이터를 Slave에서 읽지 못하는 Read-After-Write 일관성 문제를 어떻게 해결할 수 있을까요?

5 성능 트러블슈팅
Hard

Q. 프로덕션 환경에서 특정 쿼리가 평소에는 빠르게 실행되다가 간헐적으로 매우 느려지는 현상이 발생했습니다. 이런 간헐적 성능 저하의 원인을 진단하는 체계적인 접근 방법과 확인해야 할 사항들을 설명해주세요.

A. 모범답안

간헐적 성능 저하는 잠금 대기, 버퍼 풀 상태 변화, 통계 정보 변경, 디스크 I/O 경합 등 다양한 원인이 있습니다. 먼저 Performance Schema나 SHOW PROCESSLIST로 해당 시점의 잠금 대기 여부를 확인하고, InnoDB 버퍼 풀의 히트율 변화를 모니터링합니다. EXPLAIN 실행 계획이 시간에 따라 달라지는지 확인하여 통계 정보 변경 여부를 점검하고, 필요시 ANALYZE TABLE로 통계를 갱신합니다. 시스템 레벨에서는 iostat, vmstat으로 디스크 I/O 대기나 메모리 스왑 발생을 확인하며, 동일 시간대에 실행되는 배치 작업이나 백업 작업이 있는지 확인합니다. 쿼리 힌트나 optimizer_switch 설정으로 실행 계획을 고정하거나, 부하가 높은 시간대를 피해 작업을 스케줄링하는 방법으로 해결할 수 있습니다.

핵심 포인트
  • • 잠금 대기, 버퍼 풀 상태, 통계 정보 변경, 디스크 I/O 경합 확인
  • • Performance Schema, EXPLAIN, 시스템 모니터링 활용
  • • 실행 계획 고정, 작업 스케줄링 조정
Follow-up 질문

MySQL의 Adaptive Hash Index가 간헐적 성능 저하의 원인이 될 수 있는 상황을 설명하고, 이를 어떻게 진단하고 해결할 수 있을까요?

댓글 0

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

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