목차

1장 MySQL 아키텍처 

MySQL의 논리적 아키텍처 
- 연결 관리와 보안
- 최적화와 실행
동시성 제어 
- 읽기/쓰기 잠금
- 잠금 세분성
트랜잭션 
- 격리 수준
- 데드락
- 트랜잭션 로깅
- MySQL의 트랜잭션
MVCC(다중 버전 동시성 제어) 
MySQL의 스토리지 엔진 
- MyISAM 엔진
- MyISAM 병합 엔진
- InnoDB 엔진
- Memory 엔진
- Archive 엔진
- CSV 엔진
- Federated 엔진
- Blackhole 엔진
- NDB 클러스터 엔진
- Falcon 엔진
- SolidDB 엔진
- PBXT(Primebase XT) 엔진
- Maria 엔진
- 그 밖의 스토리지 엔진
- 적합한 엔진 선택하기
- 고려 사항
- 실용 예제
- 스토리지 엔진 요약
- 테이블 변환

2장 병목지점 찾기: 벤치마킹과 프로파일링 

왜 벤치마크하는가? 
벤치마킹 전략들 
- 무엇을 측정할 것인가
벤치마킹 전술 
- 벤치마크를 설계하고 계획하기
- 정확한 결과 얻기
- 벤치마크를 실행하고 결과를 분석하기
벤치마크 도구 
- 풀-스택 도구
- 단일 컴포넌트 도구
벤치마크 사례들 
- http_load
- sysbench
- 데이터베이스 테스트 스위트의 dbt2 TPC-C 
- MySQL 벤치마크 스위트
프로파일링 
- 응용프로그램 프로파일링하기
- MySQL 프로파일링
- MySQL 서버 프로파일링하기
- SHOW STATUS 로 쿼리 프로파일하기
- SHOW PROFILE
- MySQL을 프로파일하는 다른 방법
- 프로파일링 코드를 넣지 못할 때
운영체제 프로파일링 
- MySQL 연결 및 프로세스의 문제 해결하기
- 고급 프로파일링 및 문제 해결

3장. 스키마 최적화와 인덱싱 

최적의 데이터 타입 고르기 
- 정수 타입
- 실수 타입
- 문자열 타입
- 날짜 및 시간 타입
- 비트(Bit)로 구성된 데이터 타입
- 식별자 고르기
- 특별한 데이터 타입
인덱싱 기초 
- 인덱스의 종류
고성능을 위한 인덱싱 전략 
- 칼럼을 격리시키기
- 프리픽스 인덱스와 인덱스 선택도
- 클러스터링 인덱스
- 커버링 인덱스
- 정렬을 위한 인덱스 스캔의 사용
- 압축(프리픽스 압축) 인덱스
- 중첩 또는 중복된 인덱스
- 인덱스와 잠금
인덱싱 사례 연구 
- 여러 종류의 필터링 지원하기
- 다수의 범위 조건 피하기
- 정렬 최적화하기
인덱스 및 테이블 유지보수 
- 테이블 손상을 발견하고 고치기
- 인덱스 통계정보 갱신하기
- 인덱스 및 데이터 단편화 줄이기
정규화와 비정규화 
- 정규화된 스키마에 대한 찬반론
- 비정규화된 스키마에 대한 찬반론
- 정규화와 비정규화의 혼합
- 캐시 및 집계 테이블
ALTER TABLE의 속도를 향상시키기 
- .frm 파일만 수정하기
- MyISAM 인덱스를 신속하게 구축하기
스토리지 엔진에 대하여 
- MyISAM 스토리지 엔진
- Memory 스토리지 엔진
- InnoDB 스토리지 엔진

4장 쿼리 성능 최적화 

슬로우 쿼리: 데이터 접근을 최적화하기 
- 데이터베이스에 필요 이상의 데이터를 요구하고 있는가?
- MySQL이 너무 많은 데이터를 조사하는가?
쿼리를 재구성하는 방법들 
- 복잡한 쿼리 vs 여러 개의 쿼리
- 쿼리 자르기
- 조인 분해
쿼리 실행의 기초 
- MySQL 클라이언트/서버 프로토콜
- 쿼리 캐시
- 쿼리 최적화 단계
- 쿼리 실행 엔진
- 결과를 클라이언트로 돌려주기
MySQL 쿼리 옵티마이저의 제한 사항 
상관 서브쿼리
특정 형식의 쿼리 최적화하기 
- COUNT() 쿼리 최적화하기
- 조인 쿼리 최적화하기
- 서브쿼리 최적화하기
- GROUP BY와 DISTINCT 최적화하기
- LIMIT와 OFFSET 최적화하기
- SQL_CALC_FOUND_ROWS 최적화하기
- UNION 최적화 하기
쿼리 최적화 힌트 
사용자 정의 변수 
- MySQL 업그레이드에 주의하기

5장 고급 MySQL 기능 

MySQL의 쿼리 캐시 
- MySQL이 캐시 적중을 검사하는 방법
- 캐시가 메모리를 쓰는 법
- 쿼리 캐시가 도움이 될 때
- 쿼리 캐시를 튜닝하고 유지보수하는 법
- InnoDB와 쿼리 캐시
- 일반적인 쿼리 캐시 최적화
- 쿼리 캐시의 대안
MySQL 안에 코드를 저장하기 
- 스토어드 펑션과 프로시저
- 트리거
- 이벤트
- 스토어드 코드 안의 주석 보존하기
커서 
프리페어 스테이트먼트 
- 프리페어 스테이트먼트 최적화
- 프리페어 스테이트먼트 용 SQL 인터페이스 
- 프리페어 스테이트먼트의 제한 사항
사용자 정의 함수 
뷰 
- 업데이트 가능한 뷰
- 뷰의 성능
- 뷰의 한계
문자 셋과 콜레이션 
- MySQL이 문자 셋을 사용하는 방법 
- 문자 셋과 콜레이션 고르기
- 문자 셋과 콜?이션은 쿼리에 어떻게 영향을 미치는가
전문 검색 
- 자연어 검색
- 불리언 검색
- MySQL 5.1 이상에서의 전문 검색의 변화
- 전문 검색의 득과실 그리고 해결책
- 전문 검색 튜닝과 최적화
외래 키 제약조건 
머지 테이블과 파티션 테이블 
- 머지 테이블
- 파티션 테이블
분산(XA) 트랙잭션 
- 내부 XA 트랜잭션 
- 외부 XA 트랜잭션

6장 서버 설정 최적화 

기본 설정 방법 
- 문법과 변수의 범위 그리고 동적 재설정
- 변수 설정의 부작용
- 시작하기
일반적인 튜닝 
- 메모리 사용 튜닝하기
- MyISAM 키 캐시
- InnoDB 버퍼 풀
- 스레드 캐시
- 테이블 캐시
- InnoDB 데이터 사전
MySQL의 I/O 조작 튜닝하기 
- MyISAM I/O 튜닝
- InnoDB I/O 튜닝
MySQL 동시성 튜닝하기 
- MyISAM 동시성 튜닝
- InnoDB 동시성 튜닝
작업량에 기초한 튜닝 
- BLOB와 TEXT 작업 최적화하기
- 파일 정렬 최적화
- MySQL 서버 상태 변수 검사하기
커넥션별 설정 튜닝하기 

7장 운영체제와 하드웨어 최적화 

무엇이 MySQL의 성능을 제한하는가? 
MySQL 용 CPU 선택 방법 
- CPU가 빠른 것이 좋은가 많은 것이 좋은가?
- CPU 아키텍처
- 다중 CPU와 코어로 확장하기
메모리와 디스크 자원 균형맞추기 
- 랜덤 대 순차 I/O
- 캐싱, 읽기, 쓰기
- 작업 집합(Working Set)이란?
- 효과적인 메모리 대 디스크 비율 찾기
- 하드 디스크 선택하기
슬레이브용 하드웨어 선택하기 
RAID 성능 최적화 
- RAID 실패, 복구, 모니터링
- 하드웨어 RAID와 소프트웨어 RAID 균형 맞추기
- RAID 구성과 캐싱
SAN와 NAS 
- SAN
- NAS
다중 디스크 볼륨 사용하기 
네트워크 구성 
운영체제 선택하기 
파일시스템 선택하기 
스레딩 
스와핑 
운영 체제 상태 
- vmstat 출력 읽는 방법
- iostat 출력 읽는 방법
- CPU 바운드 상태의 장비
- I/O 바운드 상태의 장비
- 스와핑이 많은 장비
- 대기(Idle) 상태의 장비

8장 복제 

복제 개요 
- 복제를 통한 문제 해결
- 복제 작동 방법
복제 구성하기 
- 복제 계정 만들기
- 마스터와 슬레이브 구성하기
- 슬레이브 시작하기
- 다른 서버에서 슬레이브 초기화하기
- 권장되는 복제 구성
복제 살펴보기 
- 구문-기반 복제
- 레코드 기반 복제
- 복제 파일
- 복제 이벤트를 다른 슬레이브에 보내기
- 복제 필터
복제 형태 
- 마스터와 여러 슬레이브
- 액티브-액티브 모드의 마스터-마스터
- 액티브-패시브 모드의 마스터-마스터
- 슬레이브가 있는 마스터-마스터
- 링
- 마스터, 분배 마스터, 슬레이브
- 트리 또는 피라미드
- 사용자 정의 복제 솔루션
복제와 용량 계획 
- 복제가 쓰기 확장에 도움이 되지 못하는 이유
- 사용률 억제 계획
복제 관리와 유지 
- 복제 감시하기
- 슬레이브 지연 측정하기
- 슬레이브와 마스터의 데이터 일관성 판단하기
- 슬레이브를 마스터에 재동기화하기
- 마스터 변경하기
- 마스터-마스터 구성에서 역할 전환하기
복제 문제와 해결책 
- 데이터 손상이나 손실로 인한 오류
- 비 트랜잭션용 테이블 사용하기
- 트랜잭션용과 비 트랜잭션용 테이블 혼합하기
- 비 확정적 구문
- 마스터와 슬레이브의 다른 스토리지 엔진
- 슬레이브의 데이터 변경
- 유일하지 않은 서버 ID
- 정의되지 않은 서버 ID
- 복제되지 않은 데이터에 대한 의존성
- 누락된 임시 테이블 
- 업데이트 중 일부를 복제하지 않는 것
- InnoDB 잠금 선택으로 인한 잠금 충돌
- 마스터-마스터 복제에서 두 마스터에 모두 쓰기
- 지나친 복제 지연 시간
- 마스터의 대형 패킷
- 제한된 복제 대역폭
- 디스크 공간 없음
- 복제의 한계점
복제는 얼마나 빠른가? 
MySQL 복제의 미래 

9장 성능확장 및 고가용성 

용어 
MySQL 확장하기 
- 확장성을 위한 계획 세우기
- 확장 이전에 시간 벌기
- 수직 확장하기
- 수평 확장하기
- 스케일 백
- 클러스터링으로 확장하기
부하 분산 
- 직접 연결하기
- 중개인 도입하기
- 마스터와 여러 슬레이브로 부하 분산하기
고가용성 
- 고가용성 설계
- 중복성 추가하기
- 장애 조치와 장애 복구

10장 응용프로그램 수준의 최적화 

응용프로그램 성능 개요 
- 문제의 요인 찾기
- 일반적인 문제 찾기
웹 서버 문제 
- 최적의 동시성 알아내기
캐싱 
- 응용프로그램보다 하위 수준에서 캐시하기
- 응용프로그램 수준의 캐싱
- 캐시 조절 규칙
- 캐시 객체 계층 구조
- 컨텐츠 미리 생성하기
MySQL 확장하기 
MySQL의 대안 

11장 백업과 복구 

개요 
- 용어
- 모든 것이 복구를 위한 것이다
- 다루지 않는 주제
- 개념 잡기
- 왜 백업을 하는가?
고려 사항과 보완 해야할 점 
- 손실을 얼마나 감당할 수 있는가?
- 온라인 백업 아니면 오프라인 백업?
- 논리적 아니면 물리적 백업?
- 무엇을 백업 하는가
- 스토리지 엔진과 일관성
- 복제
바이너리 로그 관리와 백업 
- 바이너리 로그 형식
- 오래된 바이너리 로그 안전하게 삭제하기
데이터 백업하기 
- 논리 백업 만들기
- 파일시스템 스냅샷
백업에서 복구하기 
- MySQL로의 접근 제한하기
- 물리적 파일 복원하기
- 논리 백업 복원하기
- PIT(Point-in-Time) 복구
- 고급 복구 기법
- InnoDB 복구
백업과 복구 속도 
백업 도구 
- mysqldump
- mysqlhotcopy
- InnoDB 핫 백업
- mk-parallel-dump
- mylvmbackup
- Zmanda 복구 관리자
- R1Soft
- MySQL 온라인 백업
- 백업 도구 비교
백업 스크립트 작성하기 

12장 보안 

용어 
계정의 기본 
- 권한
- 권한 테이블
- MySQL의 권한 확인 방법
- 권한의 조회 및 추가, 제거
- MySQL 권한 설정하기
- MySQL 4.1에서 변경된 권한 처리 방식
- MySQL 5.0에서 변경된 권한 처리 방식
- 권한과 성능
- 일반적인 문제와 해결책
운영체제 보안 
- 지침
네트워크 보안 
- 로컬 호스트 전용 연결
- 방화벽
- DMZ 안의 MySQL
- 연결 암호화와 터널링
- TCP 래퍼
- 자동 호스트 차단
데이터 암호화 
- 비밀번호 해싱
- 암호화된 파일시스템
- 응용프로그램 수준의 암호화
- 소스 코드 수정
chroot 환경에서의 MySQL 

13장 MySQL 서버상태 

시스템 변수 
SHOW STATUS 
- 스레드와 연결 통계
- 바이너리 로깅 상태
- 명령 카운터
- 임시 파일과 테이블
- 핸들러 작업
- MyISAM 키 버퍼
- 파일 기술자
- 쿼리 캐시
- SELECT 타입
- 정렬
- 테이블 잠금
- SSL(Secure Socket Layer)
- InnoDB 전용
- 플러그인 전용
- 기타
SHOW INNODB STATUS 
- 헤더 정보
- 세마포어
- 외래키 오류
- 검출된 데드락
- 트랜잭션
- 파일 입출력
- 인서트 버퍼와 어댑티브 해시 인덱스
- 로그
- 버퍼 풀과 메모리
- 레코드 조작
SHOW PROCESSLIST 
SHOW MUTEX STATUS 
복제 상태 
INFORMATION_SCHEMA 

14장 고성능을 위한 도구들 

쿼리 실행 도구 
- MySQL의 GUI 도구들
- SQLyog
- phpMyAdmin
모니터링 도구들 
- 비대화식 모니터링 시스템
- 대화식 도구들
분석 도구들 
- HackMySQL 도구들
- Maatkit 분석 도구들
MySQL 유틸리티들 
- MySQL 프록시
- MySQL을 위한 Dormando의 Proxy
- Maatkit 유틸리티들
더 읽어볼 거리 

부록A 대용량 파일 전송 

파일 복사 
파일 복사에 대한 벤치마크 

부록B EXPLAIN 사용하기 

EXPLAIN 실행 
EXPLAIN에 나오는 칼럼들 
비쥬얼 EXPLAIN 

부록C MySQL과 함께 스핑크스 사용하기 

개요: 일반적인 용도의 스핑크스 검색 
왜 스핑크스를 사용할까? 
아키텍쳐 
특별한 기능들 
실제 구현 예제들 
결론 

부록D 락 디버깅 

서버 레벨에서 잠금 대기 
스토리지 엔진에서의 락 대기