- InnoDB 스토리지 엔진
- 버퍼 풀 성능 개선
- NUMA
- 버퍼 풀 메모리 초기 할당
- 리눅스에서는 InnoDB 버퍼 풀에 할당된 메모리를 점유하는 것이 아니라 사용할 것이라고 예약만 해두고 실제 응용 프로그램에서 접근할 때에만 리눅스가 응용 프로그램으로 할당해줌
- 장점 : 사용자의 실수를 막을 수 있음, 메모리 낭비를 막을 수 있음
- 단점 : 메모리 할당에 대해서 db 서비스를 시작할 때 관리자가 알 수 없음 -> 잘못된 메모리 할당으로 스왑을 사용하게 되거나 프로세스가 강제 종료 될 수 있음
- 단점을 보완하기 위해서 XtraDB는 버퍼 풀로 할당된 메모리 공간을 운영체제로부터 미리 모두 할당 받는 기능이 추가됨 -> 메모리 사용량 고정
- InnoDB 잠금 세분화 (MySQL 5.6)
- mutex를 세분화해서 잠금 경합을 줄임
- flush_state_mutex : 플러시 상태의 더티 페이지를 보호하는 뮤텍스
- LRU_list_mutex : 버퍼 풀에서 LRU 리스트에 저장된 페이지들을 동기화하는데 사용되는 뮤텍스
- flush_list_mutex: 버퍼 풀에서 플러시해야 할 더티 페이지들의 리스트를 동기화하는데 사용되는 뮤텍스
- free_list_mutex: 버퍼 풀에서 사용되지 않는 프리 페이지들의 리스트를 관리하는 뮤텍스
- zip_free_mutex: 압축된 페이지들을 처리하기 위해서 사용되는 프리 페이지들의 목록을 관리하는 뮤텍스
- zip_hash_mutex: 압축된 페이지들을 검색하기 위한 해시 테이블을 보호하는 뮤텍스
- 기존에 LRU_list에서 사용하던 뮤텍스를 제거
- I/O 기반의 워크로드 성능 향상
- 디스크의 데이터 파일 크기가 InnoDB 버퍼 풀 보다 커서 디스크 읽기가 빈번하게 발생함 -> 프리 페이지 필요함 -> 프리 페이지는 뮤텍스 획득을 해야 사용할 수 있는데 뮤텍스를 획득하기 위해서 많은 대기현상이 발생
- innodb_empty_free_list_algorithm
- legacy -> 기존 알고리즘: 프리 페이지를 생성하는 페이지 클리너 스레드의 뮤텍스 획득 우선순위를 부여, Free_list에 프리 페이지가 없는 경우 페이지 클린 스레드와 사용자 스레드에서 동시에 프리 페이지를 준비하고 Free_list에 추가 -> 뮤텍스 경합 유발
- backoff -> 새로운 알고리즘: Free_list에 프리 페이지가 없는 경우 XtraDB에서는 LRU_list 플러시를 사용자 스레드에서 수행하지 않고 페이지 클리너 스레드에서만 수행
- 어댑티브 해시 파티션
- PK나 인덱스에 대한 룩업이 빈번하게 발생하는 경우, 해당 인덱스의 일부 값들에 대해서 자동으로 해시 인덱스를 생성
- MySQL 5.6에서는 읽기와 쓰기를 섞어서 사용하는 쿼리가 실행될 때 동시성 문제가 발생할 수 있음
- XtraDB에서는 동시성 문제를 해결하기 위해서 시스템 변수를 도입(innodb_adaptive_hash_index_partitions)
- 1 : MySQL 5.6의 InnoDB와 동일하게 작동
- 2 이상 : 지정된 개수만큼의 어댑티브 해시 인덱스를 생성(64비트 : 최대 64, 32비트 : 최대 32)
- 원자 단위의 쓰기
- Double_write 버퍼의 사용: 더티 페이지를 디스크로 플러시 하기 전에 시스템 테이블스페이스의 DoubleWrite에 기록 -> 플러시 진행 중 비정상적 종료 -> 재시작 시 InnoDB 스토리지 엔진은 DoubleWrite 버퍼의 내용과 데이터 파일의 페이지 비교 후 다르면 복사
- FusionIO의 원자 단위의 쓰기: InnoDB 스토리지 엔진이 16KB를 디스크로 쓰기를 실행했을 때 FusionIO 드라이브는 16K가 100% 완전하게 기록되거나, 하나도 기록되지 않는 형태로 트랜잭션을 보장 -> 일부만 저장되지 않는 문제를 방지
- XtraDB에서는 시스템 변수를 이용해서 원자 단위의 쓰기를 허용함(innodb_use_atomic_write)
- ON: innodb_flush_method가 <fdatasync, O_DSYNC인 경우 O_DIRECT로 변경>, <O_DIRECT, ALL_O_DIRECT,O_DIRECT_NO_FSYNC인 경우 그대로 유지>
- 해당 시스템 변수가 ON일 경우, innodb_doublewrite는 자동으로 OFF
- 확장된 InnoDB 엔진 상태 출력(SHOW ENGINE INNODB STATUS)
- innodb_show_verbose_locks: 잠긴 레코드 정보를 출력할지 여부|0: 잠긴 테이블 및 인덱스 명 출력, 1: 잠긴 내용 상세 출력, 기본값 0|
- innodb_show_locks_held: InnoDB의 각 트랜잭션 단위로 잠금의 개수를 출력할지 여부 결정| 기본값 100, 최대 1000|
- 백그라운드 스레드 관련 상태 변수
- 세마포어 관련 상태 변수
- 인서트 버퍼와 어댑티브 해시 인덱스 관련 상태 변수
- 로그 관련 상태 변수
- 버퍼 풀 관련 상태 변수
- 트랜잭션 관련 상태 변수
- XtraDB 리두 로그 아카이빙
- 리두 로그가 재사용되기 전에 오래된 로그를 복사하는 기능이 추가 -> XtraDB 테이블에 대핸 변경 작업 로그를 수집할 수 있음
- 명령어
- PURGE ARCHIVED LOGS BEFORE <datetime> : 주어진 날짜 이전에 생성된 리두 로그 아카이브 파일 삭제
- PURGE ARCHIVED LOGS TO <log_filename> : log_filename 파일을 포함하여 이전에 생성된 리두 로그 아카이브 파일을 삭제
- 시스템 변수
- innodb_log_archive : 리두 로그 아카이빙 기능 활성화 여부|ON: 활성화, OFF: 비활성화|
- innodb_log_arch_dir: 아카이빙 리두 로그파일의 저장 디렉토리 설정, 설정 값이 없을 경우 데이터디렉토리에 저장
- innodb_log_arch_expire_sec: 설정된 시간이 지나면 아카이빙 리두 로그파일 자동 삭제|0: 기능 사용안 함, 기본값:0|
- 변경된 페이지 트랙킹
- 리두 로그 엔트리를 기반으로 변경된 페이지를 추적 -> 증분 백업 성능 향상(innodb_track_changed_page: 기록 활성화 여부 시스템변수)
- 명령어
- FLUSH CHANGED_PAGE_BITMAPS: 현재 리두 로그의 체크포인트 지점까지 변경된 페이지를 디스크의 비트맵 파일로 동기화 -> XtrBackup이 비트맵 파일을 참조할 필요가 있을 때 실행
- RESET CHANGED_PAGE_BITMAPS: 모든 비트맵 파일을 삭제하고 비트맵 파일의 시퀀스 초기화
- PURGE CHANGED_PAGE_BITMAPS BEFORE <lsn> : 주어진 로그 시뭔스 번호 이전까지의 모든 변경 페이지 이력 삭제
- 전문 검색 엔진
- 전문 검색 인덱스 추가
테이블 생성
데이터 입력
전문 검색 엔진 생성
경고메시지 확인-> FTS_DOC_ID는 전문 검색 인덱스와 테이블의 레코드를 연결하는 역할을 하며 처음으로 전문 검색 인덱스를 생성하는 경우에 컬럼이 추가됨
- 전문 검색 인덱스를 위한 테이블스페이스
전문 검색 인덱스 추가 시, 생성되는 ibd 파일 확인
- 전문 검색 인덱스 관련 INFORMATION_SCHEMA 정보
- 테이블에 사용되는 테이블스페이스를 제외하고(employee_name_innodb.ibd) 나머지 테이블스페이스는 조회할 수 없음. 따라서 INFORMATION_SCHEMA 데이터베이스에서 각 테이블스페이스에 상응하는 테이블을 제공
- InnoDB의 모든 전문 검색 인덱스에 적용되는 내용
- INNODB_FT_CONFIG: 전문 검색 인덱스의 기본 설정 저장
- INNODB_FT_DEFAULT_STOPWORD: 단위 검색어 생성 시 사용하는 기본 구분자 목록
- 전문 검색 인덱스를 가진 테이블 단위로 적용되는 내용
- 테이블 단위로 적용되는 테이블은 innodb_ft_aux_table 시스템 변수에 대상 테이블의 데이터베이스와 테이블명을 명시해야함 (데이터베이스/테이블)
- INNODB_FT_INDEX_TABLE: innodb_ft_aux_table 시스템 변수에 설정된 전문 검색 인덱스의 내용 조회
- INNODB_FT_INDEX_CACHE: 전문 검색 인덱스를 가진 테이블에 INSERT된 레코드는 임시 공간에 저장 후 전문 검색 인덱스에 반영됨, 해당 테이블은 임시 공간에 저장된 레코드 확인
- INNODB_FT_INSERTED/INNODB_FT_DELETED: 전문 검색 인덱스에 반영되기 전 추가된 레코드나 삭제된 레코드의 FTS_DOS_ID는 해당 테이블에 저장되고 쪼개진 검색어들은 INNODB_FT_INDEX_CACHE 테이블에 저장
- INNODB_FT_BEING_INSERTED/INNODB_FT_BEING_DELETED: OPTIMIZE TABLE이나 ALTER TABLE 명령으로 테이블이 리빌드되면 INNODB_FT_INSERTED/INNODB_FT_DELETED 테이블의 내용이 인덱스에 반영됨, 이 때 작업 중인 레코드의 정보가 저장되는 테이블
- 전문 검색 인덱스 사용
MATCH 컬럼에 인덱스 컬럼 모두 명시되어야 하나 순서는 무관함 -> 전문 인덱스의 모든 컬럼을 명시하지 않으면 풀 테이블 스캔 발생
- 주의사항
- MySQL5.5 버전에서 전문 인덱스를 MyISAM 테이블에서 InnoDB로 전환하고자 할 때에는 서로 사용하는 구분자 리스트가 다르므로 동일하게 설정해주어야 함
- Memcached 플러그인
- 아키텍처
- MySQL 서버에서 모든 테이블의 읽고 쓰기는 핸들러 API 계층을 통해서 처리가 되는데, 모든 스토리지 엔진을 위한 공통 API이기 때문에 InnoDB에 최적으로 작동하지 못함
- Memcached 플로그인은 핸들러 API를 거치지 않고 직접 InnoDB 스토리지 엔진을 호출하여 빠름
'MariaDB > Admin' 카테고리의 다른 글
기타 기능2 (0) | 2015.10.26 |
---|---|
[MariaDB][Admin]스토리지 엔진 - InnoDB (0) | 2015.10.20 |
MariaDB 최적화 1 (0) | 2015.10.14 |
MariaDB 옵티마이저 힌트 및 실행 계획 분석 시 주의사항 (0) | 2015.10.12 |
MariaDB 란? (0) | 2015.10.07 |