MySQL 은 프로세스 기반이 아니라, 스레드 기반
으로 작동한다.
크게 2가지 유형의 스레드로 구분함.
포그라운드 스레드 (Foreground Threads)
백그라운드 스레드
1. 데이터 파일, 로그 파일, 캐시 및 버퍼 관리 등의 백엔드 작업 수행
2. 로그 버퍼 - 디스크 기록, 다양한 시스템 유지 관리 작업 수행함.
SELECT thread_id, name, type, processlist_user, processlist_host
FROM performance_schema.threads
ORDER BY type, thread_id;
실제 사용자의 요청을 처리하는 포그라운드 스레드는 thread/sql/one_connection
이다.
이런식으로 동일한 스레드가 여러개 있는 경우, 여러 스레드가 동일 작업을 병렬로 처리하는 설정때문임.
thread_cache_size
시스템 변수를 통해 스레드 캐시에 유지할 수 있는 최대 스레드 지정 가능데이터 버퍼
나 캐시
에서 가져온다.인서트 버퍼 병합 ( Insert Buffer Merging ) 스레드
인서트 버퍼
를 사용한다.인서트 버퍼에 저장된 변경사항을 실제 인덱스와 병합
한다.이해를 돕기 위해..
- DB 에는
인덱스
라는 정렬 규칙이 있음.
인덱스
- 책의 목차 와 같은 역할을 하고
- 우리가 필요한 데이터를 빠르게 탐색 가능하다.
- 비클러스터 인덱스와 인서트 버퍼
비 클러스터 인덱스
데이터가 저장된 순서와 별개
특정 규칙에 따라 별도로 관리되는 인덱스
예시
- 책의 색인과 같이 본문의 순서와 상관없이 특정 단어가 어디에 있는지 빠르게 찾을 수 있게 해줌인서트 버퍼
비클러스터 인덱스에 데이터를 추가하는 경우
바로 인덱스를 업데이트하는 대신 임시로 저장해주는 공간
DB 성능을 향상시키기 위한 기술
- 실생활로 따지면
- 도서관에 책이 있고, 해당 책들을 바로 책장에 꽂는 대신, 일단 책을 도서관 입구에 임시로 쌓아둔다.
인서트 버퍼
- 그리고 나중에 도서관 직원이 해당 책을 적절한 책장에 꽂아 정리하는 형태
인서트 버퍼 병합
로그 기록 스레드
버퍼 풀 데이터 기록 스레드
데이터 읽기 스레드
잠금 및 데드락 모니터링 스레드
1. DB 잠금 상태를 모니터링
2. 데드락 감지하여 해결함
MySQL 5.5 이상부터 데이터 쓰기, 데이터 읽기 스레드 개수를 2개 이상으로 지정할 수 있게 됨.
쓰기 스레드 설정의 경우
*innodb_write_io_threads*
읽기 스레드 설정의 경우
- *innodb_read_io_threads*
- 보통 클라이언트 ( 포그라운드 ) 스레드에서 처리하기에, 읽기 스레드 자체는 많이 설정 X
InnoDB
***백그라운드
에서 처리하기 때문***MyISAM