- 소개
- MySQL 소개
- 왜 MySQL인가?
- 설치와 설정
- MySQl 다운로드
- MySQl 서버 설치
- 리눅스에 설치
- 윈도우에 설치(MSI)
- 서버 설정
- 설정 파일의 구성
- MySQL 시스템 변수의 특징
- 글로벌 변수와 세션 변수
- 동적 변수와 저어적 변수
- my.cnf 설정 파일
- MySQL 서버의 시작과 종료
- 시작과 종료
- 서버 연결 테스트
- MySQL 복제 구축
- 설정 준비
- 복제 계정 준비
- 데이터 복사
- 복제 시작
- 권한 관리
- 사용자의 식별
- 권한
- 예제 데이터 적재
- 전문 검색을 위한 MySQL 설치
- MySQL의 내장 전문 검색 엔진
- MySQl 5.0 버전의 트리톤 설치
- MySQl 5.1 버전의 mGroonga 설치
- 아키텍처
- MySQL 아키텍처
- MySQL의 저너체 구조
- MySQL 쓰레딩 구조
- 메모리 할당 및 사용 구조
- 플러그인 스토리지 엔진 모델
- 쿼리 실행 구조
- 복제(Replication)
- 쿼리 캐시
- InnoDB 스토리지 엔진 아키텍처
- InnoDB 스토리지 엔진의 특성
- InnoDB 버퍼 풀
- 언두(Undo) 로그
- 인서트 버퍼(Insert Buffer)
- 리두(Redo) 로그 및 로그 버퍼
- MVCC
- (Multi Version Concurrency Control)
- MyISAM 스토리지 엔진 아키텍처
- 키 캐시
- 운영체제의 캐시 및 버ㅓ퍼
- MEMORY 스토리지 엔진 아키텍처
- 주의 사항
- MEMORY 스토리지 엔진의 용도
- NDB 클러스터 스토리지 엔진
- NDB 클러스터의 특성
- NDB 클러스터의 아키텍처
- 클러스터 간의 복제 구성
- NDB 클러스터의 성능
- NDB 클러스터의 네트워크 영향
- NDB 클러스터의 용도
- TOKUDB 스토리지 엔진
- 프랙탈 트리(Fractal Tree) 인덱스 지원
- 대용량 데이터와 빠른 INSERT 처리
- 트랜잭션 및 잠금 처리
- 그 이외의 특징
- TokuDB의 주 용도
- 전문 검색 엔진
- 트리톤 전문 검색 엔진
- mGroonga 전문 검색 엔진(플러그인)
- 스핑크스 전문 검색 엔진
- MySQL 로그 파일
- 에러 로그 파일
- 제너럴 쿼리 로그 파일(제너럴 로그 파일, General log)
- 슬로우 쿼리 로그
- 바이너리 로그와 릴레이 로그
- 트랜잭션과 잠금
- 트랜잭션
- MySQL에서의 트랜잭션
- 주의사항
- MySQL 엔진의 잠금
- 글로벌 락
- 테이블 락(TABLE LOCK)
- 유저 락(USER LOCK)
- 네임 락
- MyISAM과 MEMORY 스토리지 엔진의 잠금
- 잠금 획득
- 잠금 튜닝
- 테이블 수준의 잠근 확인 및 해제
- InnoDB 스토리지 엔진의 잠금
- InnoDB의 잠금 방식
- InnoDB의 잠금 종류
- 인덱스와 잠금
- 트랜잭션 격리 수준과 잠금
- 레코드 수준의 잠금 확인 및 해제
- MySQL 의 격리 수준
- READ UNCOMMITTED
- READ COMMITED
- REPEATABLE READ
- SERIALIZABLE
- REPEATABLE READ 격리 수준과 READ COMMITTED 격리 수준의 성능 비교
- 인덱스
- 디스크 읽기 방식
- 저장 매체
- 디스크 드라이브와 솔리드 스테이트 드라이브
- 랜덤 I/O와 순차 I/O
- 인덱스란?
- B-Tree 인덱스
- 구조 및 특성
- B-Tree 인덱스 키 추가 및 삭제
- B-Tree 인덱스 사용에 영향을 미치는 요소
- B-Tree 인덱스를 통한 데이터 읽기
- 다중 컬럼(Multi-column) 인덱스
- B-Tree 인덱스의 정렬 및 스캔 방향
- B-Tree 인덱스의 가용성과 효율성
- 해시(Hash) 인덱스
- 구조 및 특성
- 해시 인덱스의 가용성 및 효율성
- R-Tree 인덱스
- 구조 및 특성
- R-Tree 인덱스의 용도
- Fractal-Tree 인덱스
- Fractal-Tree의 특성
- Fractal-Tree의 가용성과 효율성
- 전문 검색(Full Text search) 인덱스
- 인덱스 알고리즘
- 구분자와 N-그램의 차이
- 전문 검색 인덱스의 가용성
- 비트맵 인덱스와 함수 기반 인덱스
- 클러스터링 인덱스
- 클러스터링 인덱스
- 보조 인덱스(Secondary index)에 미치는 영향
- 클러스터 인덱스의 장점과 단점
- 클러스터 테이블 사용 시 주의사항
- 유니크 인덱스
- 유니크 인덱스와 일반 보조 인덱스의 비교
- 유니크 인덱스 사용 시 주의사항
- 외래키
- 자식 테이블의 변경이 대기하는 경우
- 부모 테이블의 변경 작업이 대기하는 경우
- 기타 주의사항
- 실행 계획
- 개요
- 쿼리 실행 절차
- 옵티마이저의 종류
- 통계 정보
- 실행 계획 분석
- id 컬럼
- select_type 컬럼
- table 컬럼
- type 컬럼
- possible_keys
- key
- key_len
- ref
- rows
- Extra
- EXPLAIN EXTENDED(Filtered 컬럼)
- EXPLAIN EXTENDED(추가 옵티마이저 정보)
- EXPLAIN PARTITIONS(Partitions 컬럼)
- MySQL의 주요 처리 방식
- 풀 테이블 스캔
- ORDER BY 처리(Using filesort)
- GROUP BY 처리
- DISTINCT 처리
- 임시 테이블(Using temporary)
- 테이블 조인
- 실행 계획 분석 시 주의사항
- Select_type 컬럼의 주의 대상
- Type 컬럼의 주의 대상
- Key 컬럼의 주의 대상
- Rows 컬럼의 주의 대상
- Extra 컬럼의 주의 대상
- 쿼리 작성 및 최적화
- 쿼리와 연관된 시스템 설정
- SQL 모드
- 영문 대소문자 구분
- MySQL 예약어
- 메뉴얼의 SQL 문법 표기를 읽는 방법
- MySQL 연산자와 내장 함수
- 리터럴 표기법
- MySQL 연산자
- MySQL 내장 함수
- SQL 주석
- SELECT
- SELECT 각 절의 처리 순서
- WHERE 절과 GROUP BY절, 그리고 ORDER BY 절의 인덱스 사용
- WHERE 절의 비교 조건 사용 시 주의사항
- DISTINCT
- LIMIT n
- JOIN
- GROUP BY
- ORDER BY
- 서브 쿼리
- 집합 연산
- LOCK IN SHARE MODE와 FOR UPDATE
- SELECT INTO OUTFILE
- INSERT
- INSERT와 AUTO_INCREMENT
- INSERT IGNORE
- REPLACE
- INSERT INTO ... ON DUPLICATE KEY UPDATE
- INSERT .. SELECT ..
- LOAD DATA(LOCAL) INFILE ..
- UPDATE
- UPDATE ... ORDER BY ... LIMIT n
- JOIN UPDATE
- DELETE
- DELETE ... ORDER BY ... LIMIT n
- JOIN DELETE
- 스키마 조작(DDL)
- 데이터베이스
- 테이블
- 칼럼 변경
- 인덱스 변경
- 프로세스 조회
- 프로세스 강제 종료
- 시스템 변수 조회 및 변경
- 경고나 엘 ㅓㅓ조회
- 권한 조회
- SQL 힌트
- 힌트의 사용법
- STRAIGHT_JOIN
- USE INDEX / FORCE INDEX / IGNORE INDEX
- SQL_CACHE / SQL_NO_CACHE
- SQL_CALC_FOUND_ROWS
- 기타 힌트
- 쿼리 성능 테스트
- 쿼리의 성능에 영향을 미치는 요소
- 쿼리의 성능 테스트
- 쿼리 프로파일링
- 확장 기능
- 전문 검색
- 전문 검색 엔진의 종류와 특성
- MySQL 빌트인 전문 ㄱ머색
- 트리톤 전문 검색
- mGroonga 전문 검색
- 공간 검색
- R-Tree 인덱스를 사용하는 경우
- 위도나 경도 정보를 이용한 거리 계산
- R-Tree를 이용한 위치 검색
- 사용자 정의 변수
- 사용자 정의 변수 소개
- 사용자 변수의 기본 활용
- 사용자 변수의 적용 예제
- N번째 레코드만 가져오기
- 누적 합계 구하기
- 그룹별 랭킹 구하기
- 랭킹 업데이트하기
- GROUP BY 와 ORDER BY가 인덱스를 사용하지 못하는 쿼리
- 주의사항
- 파티션
- 개요
- 파티션을 사용하는 이유
- MySQL 파티션의 내부 처리
- 주의사항
- 파티션의 제한 사항
- 파티션 사용 시 주의사항
- MySQl 파티션의 종류
- 레인지 파티션
- 리스트 파티션
- 해시 파티션
- 키 파티션
- 리니어 해시 파티션/리니어 키 파티션
- 서브 파티션
- 파티션 테이블의 실행 계획
- 파티션 테이블 관련 벤치마킹
- 파티션 기능에 대한 결론
- 스토어드 프로그램
- 스토어드 프로그램의 장단점
- 스토어드 프로그램의 장점
- 스토어드 프로그램의 단점
- 스토어드 프로그램의 문법
- 예제 테스트 시 주의사항
- 스토어드 프로시저
- 스토어드 함수
- 트리거
- 이벤트
- 스토어드 프로그램 본문(Body) 작성
- 스토어드 프로그램의 권한 및 옵션
- DEFINER와 SQL SECURITY 옵션
- 스토어드 프로그램의 권한
- DETERMINISTIC과 NOT DETERMINISTIC 옵션
- 스토어드 프로그램의 참고 및 주의사항
- 한글 처리
- 스토어드 프로그램과 세션 변수
- 스토어드 프로시저와 재귀 호출(Recursive call)
- 중첩된 커서 사용
- 쿼리 종류별 잠금
- InnoDB 기본 잠금 방식
- SELECT
- INSERT, UPDATE, DELETE
- SQL 문장별로 사용하는 잠금
- SELECT 쿼리의 잠금
- INSERT 쿼리의 잠금
- UPDATE 쿼리의 잠금
- DELETE 쿼리의 잠금
- DDL 문장의 잠금
- InnoDB에서 여러 쿼리 패턴 간의 잠금 대기
- InnoDB에서 데드락 만들기
- 패턴 1(상호 거래 관련)
- 패턴 2(유니크 인덱스 관련)
- 패턴 3(외래키 관련)
- 패턴 4(서로 다른 인덱스를 통한 잠금)
- 프로그램 연동
- 자바
- JDBC 버전
- MySQL Connector/J를 이용한 개발
- C/C++
- 주요 헤더 파일과 MySQl 예제
- 에러 처리
- 프로그램 컴파일
- MySQl 서버 접속
- 설정 파일 읽기
- SELECT 실행
- INSERT / UPDATE / DELETE 실행
- 다중 문장 실행과 다중 결과 셋 가져오기
- 커넥션 옵션
- 프리페어 스테이트먼트 사용
- 데이터 모델링
- 논리 모델링
- 모델링 용어
- 용어집
- 엔티티
- 어트리뷰트(속성)
- 식별자(프라이머리 키)
- 관계(릴레이션)
- 엔티티의 통합
- 관계의 통합
- 모델 정규화
- 물리 모델링
- 프라이머리 키 선택
- 데이터 타입 선정
- 반정규화
- 데이터 타입
- 문자열(CHAR 와 VARCHAR)
- 저장 공간
- 비교 방식
- 문자집합(캐릭터 셋)
- 콜레이션(Collation)
- 문자열 이스케이프 처리
- 숫자
- 정수
- 부동 소수점
- DECIMAL
- 정수 타입의 컬럼을 생서할 때의 주의사항
- 자동 증가(AUTO_INCREMENT) 옵션 사용
- 날짜와 시간
- TIMESTAMP 타입의 옵션
- 타임존 등록 및 사용
- ENUM 과 SET
- ENUM
- SET
- TEXT, BLOB
- 공간(Spatial) 데이터 타입
- POINT 타입
- LINESTRING 타입
- POLYGON 타입
- GEOMETRY 타입
- 베스트 프랙티스
- 임의(랜덤) 정렬
- 지금까지의 구현
- 인덱스를 이용한 임의 정렬
- 페이징 쿼리
- 지금까지의 방법
- 불필요한 접근을 제거하기 위한 페이징 쿼리
- MySQL에서 시퀀스 구현
- 시퀀스용 테이블 준비
- 시퀀스를 위한 스토어드 함수
- 여러 시퀀스 처리하기
- 시퀀스 사용시 주의사항
- 큰 문자열 컬럼의 인덱스(해시)
- 테이블 파티션
- SNS 타임라인 구현
- 예제 시나리오
- 인덱스 테이블 사용
- Try & Fail 쿼리
- MySQL 표준 설정
- MySQL 표준 설정의 필요성
- 표준 설정의 예시
- 복제를 사용하지 않는 MySQL의 설정
- MySQL 복제 구축
- MySQL 복제의 형태
- 확장(스케일 아웃)
- 가용성
- 복제가 구축된 MySQL에서의 작업
- SQL 작성 표준
- 조인 조건은 항상 ON 절에 기재
- 테이블 별칭(Alias) 사용 및 컬럼 명에 테이블 별칭 포함
- 서버 사이드 프리페어 스테이트먼트 사용
- FULL GROUP BY 사용
- DELETE, UPDATE 쿼리에서 ORDER BY ... LIMIT .. 사용 자제
- 문자열 리터럴 표기는 홑따옴표만 사용
- 서브쿼리는 조인으로 변경
- UNION ALL 은 사용 자제
- 스토어드 함수는 가능하면 DETERMINISTIC으로 정의
- 스토어드 프로그램에서는 예외 처리 코드를 작성
- UPDATE, DELETE 쿼리와 적용 건수(Affected row counts) 체크
- 숫자 값은 반드시 숫자 타입의 컬럼으로 정의
- 하드웨어와 플랫폼 선정
- 하드웨어 선정
- 운영체제의 파일 시스템 선정
- 백업 및 모니터링
- 백업(EnterpriseBackup과 mysqldump)
- 모니터링
- 스키마 검토
- 응급 처치
- 서버 과부하
- 운영체제의 유틸리티를 이용해 장비의 부하 확인
- MySQL 서버의 에러 로그 확인
- 서버의 프로세스 리스트 확인
- 서버의 최대 커넥션 설정 확인
- 서버의 슬로우 쿼리 분석
- 쿼리의 실행 빈도 확인
- 각 원인별 조치
- MySQL 서버 셧다운
- MySQL 복구(데이터 파일 손상)
- MyISAM
- InnoDB
- 테이블 메타 정보의 불일치
- 복제가 멈췄을 때
- 경고 메시지로 에러 로그 파일이 커질 때
- 바이너리 로그로 디스크가 꽉 찬 경우
- 마스터 MySQL 서버에서 함수 생성 오류
- MySQL의 DB명 변경
- DB의 테이블 생성 DDL만 덤프
- mysqldump의 결과를 다른 이름의 DB로 적재
- 테이블이나 레코드의 잠금 해결
- InnoDB의 잠금 대기 시간 초과
- MySQL 서버의 호스트 잠금
- MySQL 5.1의 새로운 기능
- 파티션
- 레코드 기반의 복제(Row-based replication)
- 플러그인 API
- 이벤트 스케줄러
- 서버 로그 테이블
- InnoDB 플러그인 1.0의 새로운 기능
- InnoDB의 빠른 인덱스 생성
- InnoDB 데이터 압축
- BLOB이나 TEXT 타입 관리
- InnoDB 파일 포맷 관리
- InnoDB INFORMATION_SCHEMA 테이블
- 확장성 개선을 위한 빠른 잠금 처리
- 운영체제의 메모리 할당 기능 사용
- InnoDB 인서트 버퍼 제어
- Adaptive Hash Index 제어
- Read Ahead 알고리즘의 개선
- 다중 백그라운드 I/O 스레드
- 그룹 커밋
- 마스터 스레드의 I/O 성능 제어
- 더티 페이지의 플러시 제어
- Spin loop에서 PAUSE 사용
- 버퍼 풀의 관리 기능 개선
- 여러 시스템 설정의 동적인 제어
- TRUNCATE TABLE 시에 테이블 스페이스 공간 반납
- InnoDB의 통계 수집을 위한 페이지 샘플링 수 조절
- MySQL 서버의 개선 사항
- 스레드 풀
- 사용자 인증 플러그인 아키텍처
- 반동기 복제(Semi-synchronous Replication)
- 유니코드 지원 확장
- 기본 스토리지 엔진의 변경
- SIGNAL 과 RESIGNAL 기능 추가
- 파티션 기능 개선
- InnoDB 플러그인 1.1의 개선 사항
- 인덱스 생성 방식 변경
- 트랜잭션 복구 성능 향상
- InnoDB 성능 진단을 위한 PERFORMANCE_SCHEMA
- 다중 버퍼 풀
- 다중 롤백 세그먼트
- 버퍼 풀 관련 뮤텍스 개선
- 인서트 버퍼 처리 개선
- 비동기화된 디스크 I/O
- InnoDB 테이블을 위한 풀 텍스트 검색
- InnoDB의 리두 로그 파일 크기
- 언두 테이블 스페이스
- InnoDB 버퍼 풀의 자동 워밍 업
- InnoDB 페이지 크기 조정
- 멀티 스레드 슬레이브
- Memcached 를 위한 NoSQL 확장
부록A MySQL 5.1(InnoDB Plugin 1.0)의 새로운 기능
부록B MySQL 5.5(InnoDB Plugin 1.1)의 새로운 기능
부록C MySQL 5.6의 새로운 기능
반응형