역할별 질문 (개발자, DBA, DevOps)
개발자: MySQL 과 상호 작용할 때 애플리케이션에서 N+1 쿼리 문제를 어떻게 처리하나요?
답변:
N+1 쿼리 문제는 부모 레코드 목록을 가져온 다음, 각 부모에 대해 관련 자식 레코드를 가져오기 위해 별도의 쿼리를 실행할 때 발생합니다. 이를 해결하기 위해 JOIN 연산 (예: LEFT JOIN) 을 사용하여 단일 쿼리에서 필요한 모든 데이터를 가져오거나, ORM 에서 제공하는 즉시 로딩 (eager loading) 메커니즘을 사용하여 연관된 데이터를 미리 가져옵니다.
개발자: MySQL 에서 CHAR와 VARCHAR 데이터 타입의 차이점을 설명해주세요.
답변:
CHAR는 고정 길이 문자열 타입으로, 짧은 값은 정의된 길이까지 공백으로 채웁니다. 고정 길이 데이터에는 더 빠르지만 공간을 낭비할 수 있습니다. VARCHAR는 가변 길이 문자열 타입으로, 입력된 문자만 저장하고 길이 바이트를 추가합니다. 가변 문자열 길이에 더 공간 효율적이지만 길이 계산으로 인해 약간 느릴 수 있습니다.
DBA: innodb_buffer_pool_size 매개변수의 목적은 무엇이며, 일반적으로 어떻게 크기를 조정하나요?
답변:
innodb_buffer_pool_size 매개변수는 InnoDB 가 데이터와 인덱스를 캐싱하는 메모리 영역을 정의합니다. 디스크 I/O 를 줄여주므로 성능에 매우 중요합니다. 일반적으로 전용 MySQL 서버의 사용 가능한 RAM 의 50-80% 로 크기를 조정하여 OS 및 기타 프로세스를 위한 충분한 메모리를 남겨둡니다.
DBA: MySQL 서버에서 높은 CPU 사용량 문제를 해결하기 위해 어떤 단계를 거치겠습니까?
답변:
SHOW PROCESSLIST를 확인하여 오래 실행되는 쿼리를 찾고, SHOW ENGINE INNODB STATUS를 확인하여 뮤텍스 경합 (mutex contention) 을 확인하는 것부터 시작합니다. 그런 다음 느린 쿼리 로그에서 pt-query-digest 출력을 분석하여 문제의 쿼리를 식별합니다. 마지막으로 OS 수준 메트릭 (예: top, vmstat) 을 검토하여 MySQL 관련 문제가 아닌지 확인합니다.
DBA: PRIMARY KEY 대신 UNIQUE 인덱스를 사용하는 경우는 언제인가요?
답변:
PRIMARY KEY는 각 행을 고유하게 식별하고 NOT NULL을 강제하며 테이블당 하나만 가질 수 있습니다. InnoDB 테이블의 클러스터형 인덱스로, 물리적 저장 순서를 결정합니다. UNIQUE 인덱스도 고유성을 강제하지만 NULL 값을 허용하며 (명시적으로 NOT NULL이 아닌 경우 여러 NULL 허용), 테이블은 여러 개의 UNIQUE 인덱스를 가질 수 있습니다. 기본 식별자에는 PRIMARY KEY를, 다른 고유 제약 조건에는 UNIQUE를 선택합니다.
DevOps: MySQL 백업을 자동화하고 복구 가능성을 어떻게 보장하나요?
답변:
논리적 백업을 위해 mysqldump를 사용하거나 InnoDB 의 물리적 핫 백업을 위해 Percona XtraBackup 을 사용하여 백업을 자동화합니다. 이는 cron 작업을 통해 예약됩니다. 복구 가능성을 보장하기 위해 백업은 오프사이트에 저장되며, 정기적으로 별도의 환경에 테스트 복원을 수행하여 무결성과 복구 프로세스를 검증합니다.
DevOps: 고가용성 MySQL 설정을 어떻게 구현하겠습니까?
답변:
고가용성을 위해 일반적으로 데이터 중복 및 장애 조치를 위해 MySQL 복제 (Master-Slave 또는 Group Replication) 를 사용합니다. 로드 밸런서 (예: ProxySQL, HAProxy) 가 앞에 위치하여 트래픽을 지시하고 장애 조치 감지를 처리합니다. Orchestrator 또는 MHA 는 자동화된 장애 조치 관리에 사용할 수 있습니다.
답변:
binlog_format은 변경 사항이 바이너리 로그에 기록되는 방식을 결정합니다. STATEMENT는 SQL 문을 기록하고, ROW는 행 수준 변경 사항을 기록하며, MIXED는 조합을 사용합니다. ROW 형식은 일반적으로 안정성과 비결정적 복제 문제를 피하는 데 선호되며, 특히 복잡한 쿼리나 UDF 와 함께 사용될 때 그렇습니다.
개발자: 애플리케이션에서 SQL 인젝션 취약점을 어떻게 방지하나요?
답변:
매개변수화된 쿼리 또는 준비된 문 (prepared statements) 을 사용하여 SQL 인젝션을 방지합니다. 이는 SQL 코드와 사용자 제공 데이터를 분리하여 입력이 실행 가능한 코드가 아닌 리터럴 값으로 처리되도록 합니다. ORM 은 일반적으로 이를 자동으로 처리하지만, 기본 메커니즘을 이해하는 것이 중요합니다.
DBA: EXPLAIN을 사용하는 시나리오와 어떤 정보를 찾는지 설명해주세요.
답변:
느린 쿼리의 실행 계획을 분석하기 위해 EXPLAIN을 사용합니다. type(예: ALL은 전체 테이블 스캔을 나타내고, ref 또는 eq_ref는 좋음), rows(검사된 행 수), Extra(예: 'Using filesort', 'Using temporary') 및 인덱스가 효과적으로 사용되고 있는지 여부를 확인합니다. 이는 누락되거나 비효율적인 인덱스를 식별하는 데 도움이 됩니다.
DevOps: 프로덕션 환경에서 MySQL 성능을 어떻게 모니터링하나요?
답변:
다양한 도구를 조합하여 MySQL 성능을 모니터링합니다. Prometheus 와 MySQL Exporter 는 QPS, 연결, 버퍼 풀 히트율과 같은 메트릭을 제공합니다. Percona Monitoring and Management (PMM) 는 쿼리, OS 메트릭 및 InnoDB 상태에 대한 자세한 통찰력을 제공합니다. 또한 높은 CPU, 낮은 디스크 공간 또는 느린 쿼리와 같은 중요한 임계값에 대한 경고를 설정합니다.