☁️ MySQL 사용이유
Oracle과 비교한 MySQL의 경쟁력은 가격이다. 방대한 양을 저장하고 트래픽을 수용하기에 Oracle RDBMS는 너무 비싸다. MySQL은 Oracle 만큼이나 레퍼런스가 많고 안정적이기에 사용하기에 좋다고 생각한다.
☁️ MySQL 아키텍처
MySQL은 크게 MySQL 엔진과 스토리지 엔진으로 구분할 수 있다.
MySQL엔진
: 쿼리 파싱, 옵티마이저 등 사용자 요청에 대한 전반적인 처리를 담당한다.스토리지 엔진
: 디스크에 쓰기, 읽기 작업을 수행한다. 스토리지 엔진 마다 수행 방식이 상이하다.
MySQL엔진
MySQL 엔진은 클라이언트로부터의 접속 및 쿼리 요청을 처리하는 커넥션 핸들러, SQL파서, 전처리기, 쿼리를 최적화 해주는 옵티마이저가 중심을 이룬다.
스토리지 엔진
실제 데이터를 디스크에 저장하거나, 읽어오는 처리를 담당한다. MySQL 서버에서 MySQL 엔진은 하나지만 스토리지 엔진은 여러 개를 동시에 사용할 수 있다. MySQL이 지원하는 대표적인 스토리지 엔진으로는 InnoDB
(MySQL 8.0 ~ default), MyISAM
이 있다.
스토리지 엔진은 핸들러에 의해 동작하기에 이 핸들러를 구현한 커스텀 스토리지 엔진도 생성할 수 있다.
☁️ MySQL 스레딩
MySQL은 스레드 기반으로 동작한다. 스레드는 크게 포그라운드, 백그라운드 스레드로 구분할 수 있다.
포그라운드 스레드
InnoDB
에서 포그라운드 스레드는 스레드 캐시에서 대기하다가 클라이언트의 요청과 매핑되어 데이터를 버퍼나 캐시로부터 가져오거나, 캐시나 버퍼에 데이터가 존재하지 않는 경우 직접 디스크의 데이터나 인덱스 파일로부터 가져온다. 쓰기 작업은 버퍼까지만 포그라운드 스레드가 담당하고 이후 백그라운드 스레드가 버퍼의 데이터를 디스크로 적재하는 작업을 수행한다. (쓰기 지연: 버퍼링)
MyISAM에서는 포그라운드 스레드가 쓰기 작업까지 수행한다. (지연된 쓰기 방식이 있지만 일반적이지 않다고 한다.) 백그라운드 스레드와의 연관성이 크지 않다.
백그라운드 스레드
InnoDB에서는 여러가지 작업이 백그라운드로 처리된다.
- 인서트 버퍼를 병합
- 로그를 디스크로 기록
- InnoDB의 버퍼 풀의 데이터를 디스크에 기록
- 데이터를 버퍼로 읽어옴
- 잠금이나 데드락을 모니터링
데이터를 읽는 작업은 주로 포그라운드 스레드에서 처리하기 때문에 데이터를 버퍼로 읽는 백그라운드 스레드는 그 수를 많이 설정할 필요가 없다. 하지만 쓰기 스레드는 아주 많은 작업을 백그라운드로 처리하기에 내장 스레드를 사용할 때는 2~4 정도로 설정하는 것이 좋다고 한다. (innodb_write_io_threads 시스템 변수 설정)
InnoDB는 쓰기 작업에 대해 쓰기 지연 방식을 지원하지만 MyISAM은 포그라운드 스레드가 쓰기 작업까지 수행하기에 일반적으로 쓰기 작업에 대해 InnoDB의 성능이 우수하다.
'Database > Real MySQL' 카테고리의 다른 글
MySQL 엔진과 InnoDB 엔진의 잠금 (1) | 2024.01.27 |
---|---|
트랜잭션(Transaction)과 격리 수준(Isolation level) (1) | 2024.01.27 |
InnoDB 스토리지 엔진 - 지원 기능 (1) | 2024.01.26 |
InnoDB 스토리지 엔진 - 버퍼 풀과 리두, 언두 로그 (1) | 2024.01.26 |
쿼리 실행 구조와 MySQL 8.0 변경점 (2) | 2024.01.25 |