InnoDB

MySQL의 기본 스토리지 엔진입니다.


스토리지 엔진이란

MySQL 서버
    ├── SQL 파서 (쿼리 해석)
    ├── 옵티마이저 (실행 계획)
    └── 스토리지 엔진 (실제 데이터 저장/조회)
            ├── InnoDB ← 기본
            ├── MyISAM
            └── Memory

데이터를 어떻게 저장하고 읽을지 담당하는 부분입니다.


InnoDB 특징

특징설명
트랜잭션 지원ACID 보장
행 단위 잠금동시성 높음
외래 키 지원참조 무결성
인덱스B+Tree 사용
크래시 복구로그 기반 복구

InnoDB vs MyISAM

InnoDBMyISAM
트랜잭션OX
잠금 단위행(Row)테이블
외래 키OX
복구자동 복구수동 복구
용도일반적인 서비스읽기 전용, 로그

사용법

-- 테이블 생성 시 지정
CREATE TABLE users (
    id INT PRIMARY KEY
) ENGINE=InnoDB;  -- 기본값이라 생략 가능

-- 현재 엔진 확인
SHOW TABLE STATUS;

MySQL 5.5부터 InnoDB가 기본이라, 대부분 그냥 InnoDB를 씁니다.


InnoDB에는 두 종류의 인덱스가 있고, 동작 방식이 다릅니다.

프라이머리 인덱스 (클러스터형)

PK로 만든 인덱스입니다. 리프 노드에 실제 데이터가 있습니다.

           [PK: 50]
          /        \
    [PK: 20]      [PK: 80]
       ↓             ↓
  [실제 row]     [실제 row]

PK로 검색하면 한 번의 탐색으로 데이터를 찾습니다.


세컨더리 인덱스

PK 외의 컬럼으로 만든 인덱스입니다. 리프 노드에 PK 값만 있습니다.

CREATE INDEX idx_name ON users(name);
        [name: 김]
       /         \
  [name: 강]   [name: 박]
      ↓           ↓
   [PK: 3]     [PK: 7]    ← 실제 데이터가 아니라 PK만!

세컨더리 인덱스로 검색하면

SELECT * FROM users WHERE name = '박';
1단계: 세컨더리 인덱스에서 name='박' 찾기
       → PK = 7 발견

2단계: 프라이머리 인덱스에서 PK=7 찾기
       → 실제 데이터 반환

B-Tree를 두 번 탐색합니다.


정리

인덱스리프 노드에 저장탐색 횟수
프라이머리실제 데이터1번
세컨더리PK 값2번 (세컨더리 → 프라이머리)

왜 이렇게 설계했나

세컨더리 인덱스에 실제 데이터를 저장하면:

데이터 수정 시 → 모든 인덱스의 데이터를 수정해야 함

PK만 저장하면:

데이터 수정 시 → 프라이머리 인덱스만 수정하면 됨

저장 공간과 수정 비용을 줄이기 위한 설계입니다.

CSLOG에서 보기