MySQL의 장점과 단점은 무엇이며 어떤 경우에 적합한가요?

작성·검토 쉬었음.com

MySQL은 관계형 데이터베이스 관리 시스템으로, 특히 InnoDB 스토리지 엔진을 사용할 때 트랜잭션, 행 단위 잠금, 일관된 읽기와 같은 기능을 바탕으로 전형적인 웹 서비스와 온라인 트랜잭션 처리(OLTP)에 활용할 수 있습니다. 반면 읽기 복제는 기본적으로 비동기식이고, 고가용성 구성·복잡한 쿼리·파티셔닝에는 설계 및 운영상의 제약이 있으므로, 장점은 워크로드와 운영 역량이 맞을 때에만 실제 장점이 됩니다. dev.mysql.com dev.mysql.com

MySQL을 평가할 때는 ‘빠른 데이터베이스인가’라는 한 문장보다 어떤 데이터가 어떤 경로로 읽히고 쓰이는지, 장애 때 무엇을 보장해야 하는지, 스키마가 얼마나 복잡해질지를 함께 보는 편이 정확합니다. 또한 아래 설명은 MySQL 8.4의 공식 문서 범위에 따른 것이며, 실제 동작은 버전, 스토리지 엔진, 설정, 복제 구조에 따라 달라질 수 있습니다. dev.mysql.com

MySQL은 어떤 데이터베이스인가요?

관계형 데이터베이스는 데이터를 행과 열로 된 테이블에 저장하고, 테이블 사이의 관계를 질의 언어 SQL로 다루는 방식입니다. 예를 들어 쇼핑몰은 customers, orders, order_items 같은 테이블을 두고 고객, 주문, 주문 상품의 관계를 관리할 수 있습니다. 한 주문을 만들면서 재고를 줄이고 결제 상태를 기록하는 것처럼 여러 변경을 한 작업으로 묶어야 하는 경우가 많습니다.

MySQL에서는 스토리지 엔진이 중요합니다. 스토리지 엔진은 테이블의 저장, 잠금, 복구 방식을 담당하는 구성 요소입니다. 특히 InnoDB는 MySQL의 기본 스토리지 엔진이며 ACID 트랜잭션, 커밋과 롤백, 장애 복구, 행 단위 잠금, 다중 버전 동시성 제어(MVCC), 외래 키를 제공합니다. 따라서 흔히 말하는 MySQL의 트랜잭션 안정성은 ‘InnoDB 테이블을 적절히 구성한 MySQL’을 가리키는 경우가 많습니다. dev.mysql.com

ACID는 트랜잭션의 기대 성질을 묶어 부르는 말입니다. 원자성은 작업 전체가 성공하거나 전체가 취소되는 성질이고, 일관성은 정해 둔 데이터 규칙이 유지되는 성질입니다. 격리성은 동시에 실행되는 작업이 서로에게 미치는 영향을 통제하는 성질이며, 지속성은 커밋된 결과가 장애 뒤에도 유지되어야 한다는 성질입니다. MySQL의 ACID 특성 역시 엔진, 설정, 하드웨어와 운영 절차의 영향을 받으므로, 이름만으로 모든 실패 상황이 자동 해결된다고 이해해서는 안 됩니다. dev.mysql.com

InnoDB의 트랜잭션과 동시성은 왜 장점인가요?

OLTP는 주문 접수, 회원 정보 변경, 결제 상태 갱신처럼 비교적 짧은 요청이 빈번하게 발생하는 업무를 말합니다. 이 환경에서는 여러 사용자가 동시에 같은 종류의 데이터를 바꿀 수 있으므로, 데이터 변경을 안전하게 묶고 충돌 범위를 가능한 작게 하는 기능이 중요합니다.

InnoDB는 트랜잭션의 커밋·롤백과 장애 복구를 제공하므로, 예를 들어 주문 생성과 재고 차감 중 한 단계가 실패했을 때 애플리케이션이 트랜잭션을 롤백하도록 구성할 수 있습니다. 행 단위 잠금은 필요에 따라 특정 행을 중심으로 잠금을 잡는 방식이며, 테이블 전체를 넓게 막는 방식보다 동시 작업을 허용하는 데 유리할 수 있습니다. 다만 동일한 행이나 인접한 데이터 범위를 여러 작업이 자주 경합하면 대기와 충돌 자체가 사라지는 것은 아닙니다. dev.mysql.com

MVCC는 여러 버전의 데이터를 이용해 일관된 읽기를 제공하는 방식입니다. 단순히 ‘읽기와 쓰기가 절대 방해하지 않는다’는 뜻은 아닙니다. 트랜잭션의 격리 수준, 실행하는 SQL 문장, 잠금 읽기 여부에 따라 관찰되는 결과와 잠금 양상이 달라질 수 있습니다. 그러므로 동시성 문제를 해결할 때는 엔진 이름만 확인하지 말고, 어떤 읽기가 최신 값을 반드시 봐야 하는지와 어떤 갱신이 서로 배타적이어야 하는지를 업무 규칙으로 먼저 정해야 합니다.

외래 키는 한 테이블의 값이 다른 테이블의 존재하는 행을 참조하도록 돕는 제약입니다. 예를 들어 주문의 고객 ID가 실제 고객을 가리키도록 강제하는 데 쓸 수 있습니다. 이는 잘못된 참조를 줄이는 데 도움이 될 수 있지만, 삭제·변경 규칙과 테이블 구조를 미리 정교하게 설계해야 한다는 의미이기도 합니다. 이후 파티셔닝을 도입할 계획이라면 외래 키와의 호환성 제한도 반드시 확인해야 합니다. dev.mysql.com dev.mysql.com

개발 환경과 접근 제어 측면의 장점은 무엇인가요?

MySQL은 여러 클라이언트 프로토콜과 C/C++, Java, PHP, Python, Ruby 등을 위한 API를 제공합니다. 따라서 이미 이러한 언어와 도구를 쓰는 애플리케이션에서는 연결 계층을 구성할 선택지가 있고, 웹 애플리케이션과 데이터베이스를 연계하는 기본 경로를 마련하기 쉽습니다. 다만 특정 언어용 API가 있다는 사실만으로 연결 풀, 오류 재시도, 문자 집합, 시간대 처리까지 적절히 구성되는 것은 아닙니다. 애플리케이션의 데이터 접근 방식은 별도로 검증해야 합니다. dev.mysql.com

권한 체계도 운영 설계의 일부입니다. MySQL은 전역, 데이터베이스, 객체 수준의 권한과 동적 권한을 제공합니다. 이를 이용하면 애플리케이션 계정에는 필요한 테이블의 읽기·쓰기 권한만 주고, 백업·관리 작업에는 별도 계정을 두는 식으로 역할을 나눌 수 있습니다. 최소 권한 원칙은 계정 하나가 유출되거나 프로그램에 오류가 있을 때 영향을 제한하는 데 유용한 설계 원칙입니다. dev.mysql.com

그러나 권한을 세분화하는 것 자체가 보안을 완성하지는 않습니다. 실제로는 어떤 계정이 어떤 권한을 갖는지, 운영자가 사용하는 계정과 애플리케이션 계정을 분리했는지, 권한 변경이 어떤 절차로 이루어지는지도 관리해야 합니다. 즉 MySQL의 권한 기능은 통제 수단을 제공하지만, 그 수단을 업무 역할에 맞게 배치하는 책임은 운영 측에 남습니다.

인덱스와 파티셔닝은 어떤 문제를 해결하나요?

인덱스는 원하는 행을 찾기 위해 테이블 전체를 훑는 일을 줄이도록 만든 데이터 구조입니다. 예를 들어 주문 번호로 단일 주문을 찾는 요청이 많다면 해당 열의 인덱스가 도움이 될 수 있습니다. 다중 열 인덱스는 여러 열을 함께 조건으로 사용하는 질의에서 유용할 수 있으나, 열의 순서와 실제 질의 조건이 중요합니다. InnoDB는 테이블당 최대 64개의 보조 인덱스와 다중 열 인덱스당 최대 16개 열을 지원합니다. dev.mysql.com

하지만 인덱스는 무조건 많이 만들수록 좋은 기능이 아닙니다. 인덱스도 저장 공간을 사용하고, 행을 삽입·수정·삭제할 때 함께 관리되어야 합니다. 지원되는 인덱스 수의 상한은 설계 목표가 아니라 기술적 한계일 뿐입니다. 검색 경로를 줄이는 인덱스가 실제로 필요한지, 쓰기 경로에 어느 정도 부담을 더하는지는 대표 쿼리와 데이터 분포를 기준으로 판단해야 합니다.

문자열 인덱스에는 물리적 제약도 있습니다. InnoDB의 인덱스 키 접두사 한도는 일반적으로 3,072바이트이고, 행 형식에 따라 767바이트로 낮아질 수 있습니다. utf8mb4처럼 문자당 저장 바이트가 큰 문자 집합에서 긴 문자열을 인덱싱하려 하면 이 제한이 스키마 설계에 영향을 줄 수 있습니다. ‘문자 수’가 아니라 바이트 기준의 한도라는 점을 특히 구분할 필요가 있습니다. dev.mysql.com

파티셔닝은 하나의 테이블을 규칙에 따라 여러 파티션으로 나누어 저장하는 기능입니다. 조건이 파티션 규칙과 맞으면 파티션 프루닝이 적용되어, MySQL이 검색할 필요가 없는 파티션을 제외할 수 있습니다. 예를 들어 날짜 범위로 조회하는 대용량 이력 테이블에서 날짜를 기준으로 파티션을 나눴다면, 특정 기간 검색에서 대상 범위를 줄이는 설계를 검토할 수 있습니다. dev.mysql.com

그렇다고 큰 테이블은 모두 파티셔닝해야 하는 것은 아닙니다. 자주 쓰는 조건이 파티션 키와 맞지 않으면 기대한 대상 축소가 일어나지 않을 수 있습니다. 또한 파티셔닝은 운영, 키 설계, 제약 조건에 추가 규칙을 가져오므로 단순한 인덱스와 쿼리 개선으로 해결할 문제인지 먼저 비교하는 편이 좋습니다.

파티셔닝과 전문 검색에는 어떤 제약이 있나요?

MySQL 8.4에서 파티셔닝은 InnoDB와 NDB 스토리지 엔진에서 지원됩니다. 파티션된 InnoDB 테이블은 외래 키를 가질 수 없으며, 다른 테이블의 외래 키 참조 대상도 될 수 없습니다. 또한 파티션 키에 쓰는 모든 열은 기본 키를 포함한 모든 유니크 키의 일부여야 합니다. 주문처럼 참조 관계가 촘촘한 핵심 테이블에 파티셔닝을 적용하려 할 때, 이 조건은 모델을 크게 바꿀 수 있습니다. dev.mysql.com

전문 검색은 단어 단위로 텍스트를 검색하는 기능입니다. MySQL에서는 InnoDB와 MyISAM에서 전문 검색을 지원하지만, 파티션된 테이블에서는 지원되지 않습니다. 따라서 긴 문서의 검색 기능과 대규모 이력 데이터의 파티셔닝을 같은 테이블에 동시에 기대한다면, 이 조합이 가능한지 초기에 확인해야 합니다. 기능을 나중에 붙이는 과정에서 테이블 분리나 검색 구조 변경이 필요해질 수 있습니다. dev.mysql.com

이러한 제한은 MySQL이 기능이 부족하다는 단순한 결론보다, 기능들이 독립적으로 조합되지 않을 수 있다는 사실을 보여 줍니다. 외래 키, 유니크 키, 파티션 키, 전문 검색의 필요성을 하나씩 체크하면 되며, 한 기능의 장점만 보고 스키마를 결정하는 방식은 피하는 편이 안전합니다.

복제는 읽기 확장과 백업에 어떻게 쓰이나요?

복제는 한 서버의 변경 내용을 다른 서버에 전달하는 구조입니다. 일반적으로 소스 서버가 변경을 기록하고 레플리카 서버가 이를 적용합니다. 읽기 요청 일부를 여러 레플리카로 분산하면 소스의 읽기 부담을 줄일 수 있고, 백업이나 분석 작업을 레플리카에서 수행하도록 분리하는 방법도 검토할 수 있습니다. dev.mysql.com

GTID는 각 트랜잭션에 식별자를 부여해 복제 위치를 다루는 방식입니다. GTID 기반 복제는 로그 파일 이름과 위치를 직접 맞추는 부담을 줄이는 데 활용될 수 있습니다. 다만 복제 토폴로지를 구성했다는 사실과 복제 지연을 감시하고 복구 절차를 운영한다는 일은 별개입니다. 어떤 서버가 쓰기를 맡고, 어떤 서버에서 읽을 수 있으며, 지연이 생기면 무엇을 할지를 정해야 합니다. dev.mysql.com

기본 복제는 비동기식입니다. 즉 소스에서 커밋이 끝난 순간에 모든 레플리카가 같은 변경을 적용했다는 보장은 없습니다. 사용자가 주소를 변경한 직후 레플리카로 향한 조회가 이전 주소를 보여 주는 상황이 생길 수 있습니다. 이를 흔히 읽기 후 쓰기 일관성 문제로 볼 수 있으며, 최신 데이터가 꼭 필요한 요청을 소스로 보내거나 레플리카 적용 상태를 고려하는 정책이 필요합니다. dev.mysql.com

반동기 복제는 레플리카가 트랜잭션 이벤트를 수신하고 기록했다는 확인을 소스가 받는 방식을 사용합니다. 이것은 기본 비동기 복제와 다른 선택지이지만, 모든 요구를 완전 동기식으로 바꾸는 것과 같은 뜻은 아닙니다. 강한 동기식 요구를 논의할 때는 요구하는 일관성 수준, 지연 허용 범위, 장애 시 동작을 분명히 한 뒤 NDB Cluster 같은 별도 선택지도 함께 검토해야 합니다. dev.mysql.com

Group Replication은 고가용성을 자동으로 해결하나요?

고가용성은 서버나 네트워크 일부에 장애가 나도 서비스를 계속할 수 있도록 구성하는 목표입니다. Group Replication은 그룹의 멤버십을 관리하고 단일-primary 모드에서 primary를 자동 선출하거나 다중-primary 구성을 지원합니다. InnoDB Cluster 및 MySQL Router와 결합해 고가용성 토폴로지를 구성할 수 있다는 점은 MySQL의 중요한 선택지입니다. dev.mysql.com

그러나 서버 내부의 합의와 애플리케이션 접속 전환은 같은 문제가 아닙니다. Group Replication에는 장애 난 클라이언트를 정상 멤버로 전환하는 기능이 내장되어 있지 않습니다. 애플리케이션이 어디로 접속할지 결정하려면 Router, 로드밸런서, 커넥터 또는 자체 미들웨어가 필요하며, 이 계층도 장애·재시도·상태 갱신을 고려해 운영해야 합니다. dev.mysql.com

따라서 ‘자동 장애 조치’라는 말을 들으면 최소한 세 가지를 나누어 물어야 합니다. 첫째, primary 선출이 되는가입니다. 둘째, 애플리케이션의 새 연결이 정상 서버로 가는가입니다. 셋째, 진행 중이던 요청과 사용자가 다시 시도하는 요청은 어떤 결과를 보게 되는가입니다. 첫 번째에 대한 기능이 있다고 해서 나머지 두 가지까지 자동으로 보장되는 것은 아닙니다.

다중-primary 구성도 단순히 쓰기 성능을 늘리는 스위치로 이해하기 어렵습니다. 여러 위치에서 쓰기를 허용할 때는 동일 데이터에 대한 동시 변경을 업무적으로 어떻게 피하거나 처리할지, 애플리케이션의 쓰기 경로가 어떤 규칙을 따라야 할지를 함께 설계해야 합니다. 고가용성 구성은 기능 선택뿐 아니라 장애 훈련, 관측, 복구 절차를 포함하는 운영 문제입니다.

복잡한 쿼리에서는 왜 튜닝 부담이 커질 수 있나요?

옵티마이저는 SQL 문장을 실행하는 여러 방법 중 비용이 낮을 것으로 추정되는 실행 계획을 고르는 구성 요소입니다. 예를 들어 어느 인덱스를 먼저 사용할지, 조인할 테이블의 순서를 어떻게 잡을지 결정합니다. MySQL의 비용 기반 옵티마이저는 통계가 충분하지 않은 경우 추정에 의존할 수 있으므로, 사람이 기대한 방식과 다른 계획을 선택할 수 있습니다. dev.mysql.com

여러 테이블 조인이 늘어나면 후보 실행 계획 수가 지수적으로 증가할 수 있습니다. 이때 데이터 조회 자체뿐 아니라 적절한 계획을 탐색하는 최적화 시간도 병목이 될 수 있습니다. 따라서 복잡한 분석성 쿼리나 다수의 조인을 자주 실행하는 시스템에서는 ‘SQL이 문법상 실행되는가’만으로 적합성을 판단하기 어렵습니다. 실제 데이터 분포와 대표 조건으로 시험해야 합니다. dev.mysql.com

EXPLAIN은 쿼리에 대해 선택된 실행 계획을 확인하는 도구입니다. 실행 결과가 느릴 때는 먼저 조건절, 조인 조건, 사용하는 인덱스와 예상 행 수를 확인하고, 필요하면 통계를 갱신하거나 인덱스와 쿼리 구조를 조정할 수 있습니다. 인덱스 힌트나 옵티마이저 제어 기능도 있지만, 특정 계획을 강제하는 방법은 데이터 변화 뒤에도 타당한지 계속 검증해야 합니다. dev.mysql.com dev.mysql.com

이는 MySQL에서 복잡한 분석을 할 수 없다는 뜻은 아닙니다. 다만 대규모 다중 조인과 분석 쿼리가 핵심 워크로드라면, 튜닝에 투입할 수 있는 시간, 분석을 레플리카로 분리할지, 전문 분석 시스템을 함께 둘지를 사전에 비교하는 것이 현실적입니다. 반대로 짧고 예측 가능한 트랜잭션이 대부분인 서비스라면 이 부담이 상대적으로 작을 수 있습니다.

저장 루틴은 언제 주의해야 하나요?

저장 루틴은 데이터베이스 서버에 저장해 실행하는 프로시저나 함수입니다. 일부 데이터 처리 규칙을 데이터베이스 가까이에 둘 수 있지만, SQL 문장에 쓸 수 있는 저장 함수에는 제약이 있습니다. 예를 들어 저장 함수는 결과 집합을 반환하는 문장을 사용할 수 없습니다. 반환값 하나를 계산하는 함수와 여러 행을 돌려주는 조회 작업은 목적과 사용 방식이 다르기 때문입니다. dev.mysql.com dev.mysql.com

복제 환경에서는 저장 루틴의 결정성도 유의해야 합니다. 결정적이라는 말은 같은 입력이면 같은 결과를 낸다는 뜻입니다. 시간이나 환경 상태에 따라 달라지는 비결정적·시간 의존적 루틴은 복제 방식에 따라 재현 문제를 일으킬 여지가 있으며, 문 기반 복제에서는 특히 주의가 필요합니다. 데이터베이스 안에 업무 로직을 둘 때는 해당 로직이 복제와 장애 복구에서 같은 결과를 낼 수 있는지도 검토해야 합니다. dev.mysql.com

저장 루틴을 사용할지 여부는 기능의 유무보다 변경·시험·배포 책임을 어디에 둘지의 선택에 가깝습니다. 애플리케이션 코드와 데이터베이스 루틴에 규칙이 나뉘면 추적과 테스트가 복잡해질 수 있습니다. 반대로 데이터 무결성과 가까운 단순 규칙에는 유용할 여지도 있습니다. 중요한 것은 팀이 그 규칙의 실행 위치와 복제 영향을 이해하고 관리할 수 있는가입니다.

MySQL이 잘 맞는 경우와 신중해야 할 경우는 언제인가요?

다음 표는 특정 제품의 우열이 아니라 요구 사항과 기능의 적합성을 점검하기 위한 관점입니다.

상황MySQL에서 검토할 수 있는 근거함께 확인할 조건
일반 웹 서비스와 주문·회원 처리InnoDB의 트랜잭션, 행 단위 잠금, MVCC, 외래 키를 활용할 수 있습니다.트랜잭션 경계와 동시 갱신 규칙을 설계해야 합니다.
읽기 요청이 많은 서비스소스-레플리카 복제로 읽기, 백업, 분석 부담을 분리할 수 있습니다.레플리카 지연과 최신 읽기 정책이 필요합니다.
장애 허용 구성이 필요한 서비스Group Replication과 Router 등을 조합한 토폴로지를 검토할 수 있습니다.접속 전환과 재시도, 장애 절차는 별도로 운영해야 합니다.
날짜 범위의 대용량 이력 조회조건에 따라 파티션 프루닝으로 대상 파티션을 줄일 수 있습니다.외래 키, 유니크 키, 전문 검색 제약을 먼저 점검해야 합니다.
다수 테이블을 조인하는 분석 중심 업무SQL 실행과 인덱스·옵티마이저 제어 기능을 사용할 수 있습니다.실행 계획 검증과 지속적 튜닝 비용을 평가해야 합니다.

표의 첫 세 행은 InnoDB, 복제, Group Replication의 공식 기능에 근거한 것이며, 마지막 두 행은 파티셔닝과 옵티마이저의 동작 및 제한을 함께 반영한 것입니다. dev.mysql.com dev.mysql.com dev.mysql.com dev.mysql.com dev.mysql.com

특히 강한 다중 리전 일관성이나 무중단 전환이 핵심 요구라면 기본 비동기 복제만으로 판단해서는 안 됩니다. 최신성, 허용 가능한 지연, 장애 시 쓰기 가능 여부, 애플리케이션 전환 경로를 명시하고 Group Replication, NDB Cluster 또는 다른 분산형 선택지를 비교해야 합니다. 반대로 단일 서비스 영역에서 전형적인 읽기·쓰기 트랜잭션을 안정적으로 처리하고, 필요에 따라 읽기를 레플리카로 분산하려는 경우에는 MySQL의 기능 조합이 실용적인 출발점이 될 수 있습니다. dev.mysql.com dev.mysql.com

도입 전에 무엇을 확인해야 하나요?

첫째, 핵심 테이블이 InnoDB를 사용하는지와 트랜잭션 경계가 업무 단위와 맞는지를 확인합니다. 주문 생성처럼 함께 성공하거나 실패해야 하는 변경은 하나의 트랜잭션으로 정의하되, 불필요하게 긴 트랜잭션으로 잠금 시간을 늘리지 않도록 설계할 필요가 있습니다. 둘째, 가장 빈번한 읽기와 쓰기 쿼리를 목록화하고, 필요한 인덱스가 실제 조건 및 정렬 방식과 맞는지 검증합니다. dev.mysql.com dev.mysql.com

셋째, 복제를 쓴다면 ‘어떤 읽기까지 레플리카에서 허용하는가’를 정해야 합니다. 결제 직후 상태 확인처럼 최신성이 필요한 요청과, 약간의 지연을 허용할 수 있는 목록·통계 조회를 구분하는 방식이 한 예입니다. 넷째, 고가용성 구성이 필요하면 데이터베이스 멤버의 선출뿐 아니라 애플리케이션 연결이 실제로 어디로 이동하는지까지 장애 시나리오로 시험해야 합니다. dev.mysql.com dev.mysql.com

다섯째, 데이터가 커질 때를 가정해 파티셔닝이 정말 필요한지, 외래 키와 유니크 키 제약을 수용할 수 있는지 확인합니다. 긴 문자열 검색, 전문 검색, 파티셔닝을 함께 요구한다면 기능 간 제한을 먼저 검토해야 합니다. 마지막으로 복잡한 조인이 핵심이라면 운영 데이터에 가까운 조건에서 EXPLAIN을 확인하고, 통계와 인덱스 변경을 지속적으로 관리할 여력이 있는지 평가해야 합니다. dev.mysql.com dev.mysql.com dev.mysql.com

결론: MySQL의 장단점은 어떻게 판단해야 하나요?

MySQL의 강점은 InnoDB 기반의 트랜잭션과 동시성 제어, 다양한 개발 환경 연계, 복제를 통한 읽기 분산, 고가용성 구성을 위한 공식 기능에서 찾을 수 있습니다. 이는 일반 웹 서비스와 전형적인 OLTP에서 의미 있는 기반이 될 수 있습니다. dev.mysql.com dev.mysql.com dev.mysql.com

동시에 기본 복제의 지연 가능성, 고가용성 접속 전환의 추가 설계, 복잡한 쿼리의 계획 검증, 인덱스·파티셔닝·전문 검색의 제약은 실제 비용으로 고려해야 합니다. 결국 MySQL은 보편적으로 ‘장점만 있는’ 선택이라기보다, 데이터 일관성 요구, 읽기와 쓰기 비율, 스키마 제약, 장애 대응 수준, 튜닝과 운영 역량을 구체화했을 때 적합성을 판단할 수 있는 데이터베이스입니다. dev.mysql.com dev.mysql.com dev.mysql.com

자주 묻는 질문

MySQL의 트랜잭션 기능은 모든 테이블에서 동일하게 작동하나요?

아닙니다. ACID 트랜잭션, 행 단위 잠금, MVCC 기반 일관 읽기, 외래 키 같은 특성은 주로 InnoDB 스토리지 엔진을 전제로 합니다. 테이블마다 사용하는 엔진과 설정을 확인해야 합니다.

MySQL 레플리카에 읽기를 분산하면 항상 최신 데이터를 볼 수 있나요?

아닙니다. 기본 복제는 비동기식이므로 소스에서 커밋한 직후 레플리카에 변경 내용이 아직 반영되지 않을 수 있습니다. 최신성이 필요한 읽기는 소스로 보내거나 지연을 고려한 읽기 정책이 필요합니다.

Group Replication을 쓰면 애플리케이션 장애 전환도 자동인가요?

그렇지 않습니다. Group Replication은 멤버십과 primary 선출을 지원하지만, 장애가 난 클라이언트를 정상 서버로 옮기는 일은 내장 기능이 아닙니다. Router, 로드밸런서, 커넥터 또는 별도 미들웨어의 동작을 함께 설계해야 합니다.

파티셔닝한 InnoDB 테이블에 외래 키를 둘 수 있나요?

MySQL 8.4에서는 불가능합니다. 파티션된 InnoDB 테이블은 외래 키를 가질 수 없고 다른 테이블의 외래 키로 참조될 수도 없습니다. 파티션 키와 유니크 키의 관계도 별도로 충족해야 합니다.

MySQL은 복잡한 분석 쿼리에 사용할 수 없나요?

사용할 수는 있지만, 많은 테이블을 조인하는 쿼리는 실행 계획 후보가 크게 늘어 최적화 시간이나 선택된 계획이 문제가 될 수 있습니다. EXPLAIN으로 계획을 검토하고 통계, 인덱스, 쿼리 구조를 조정할 운영 여력을 평가하는 편이 적절합니다.