11.MySQL 엔진 구조
MySQL 엔진 구조는 아래와 같이 구성되어 있음
사용자 Application은 MySQL Connector와 연결되어 MySQL 서버에 접근할 수 있으며, SQL 쿼리를 통해 원하는 데이터에 접근 가능
전체 구조에서 MySQL Engine은 사람의 두뇌 역할,
Storage Engine은 손과 발 역할을 담당
2. MySQL Connectors
MySQL DBMS와 통신을 주고받기 위해 필요한 소프트웨어, 드라이버(Driver)라고도 함
클라이언트 프로그램 or Server Application과 MySQL 서버 간의 연결부 역할
응용 프로그램으로부터 SQL 쿼리를 전달받아 MySQL 서버에 전달
DB와의 연결용 드라이버가 없을 경우, 응용 프로그램을 통해 SQL 쿼리를 작성할 수 없게됨
다양한 프로그래밍 언어 별로 별도의 커넥터가 존재
2-1. Connector/J
Java 프로그램 전용 커넥터
2-2. .NET
C#/.NET 프로그램 전용 커넥터
3. MySQL Engine
MySQL 엔진은 클라이언트로부터의 접속 및 SQL Query 분석, 최적화해주는 역할을 수행
이러한 MySQL 엔진은 크게 Connection Pool, SQL Interface, Parser, Optimizer 등으로 구성되어 있음
3-1. Connection Pool
커넥션 풀의 역할은 아래와 같음
3-1-1. DB 접속 과정을 관리하는 Pool
DB를 연결하고 해제하는데에는 적지않은 오버헤드가 발생하기 때문에 이러한 시간과 리소스를 관리하여 서버의 부하를 줄이기 위해 미리 일정한 개수의 연결용 커넥션 Pool을 생성하고 관리함
3-1-2. Client 프로그램과의 커넥션 처리
DB로의 요청이 들어올 때마다 미리 생성된 커넥션을 제공하고, 작업이 완료되면 해당 요청에 사용된 커넥션을 다시 Pool에 반환하여 다른 요청에 재사용함
또한 Client의 인증 정보를 검증함
3-2. SQL Interface
MySQL DBMS와 상호작용하기 위한 사용자와의 통신 담당
사용자는 이를 통해 SQL문을 DB에 전달하고 결과를 응답받을 수 있음
3-3. Parser ≈ Query Parser
Query Parser라고도 하며, 쿼리 문장을 분석하고 쿼리 문장을 토큰(Token)으로 분할, Parsing하여 Tree구조를 생성하며, 쿼리가 문법적으로 유효한지 검증
3-4. PreProcessor
쿼리 파서에서 만든 Tree를 기반으로 해당 쿼리에 필요한 테이블이나 컬럼이 존재하는지, 접근 권한이 있는지 등을 검증
3-5. Optimizer
SQL문을 효율적으로 수행하기 위해 실행 계획(Execution Plan)을 검토하고 Query의 성능을 최적화하기 위해 적합한 실행 계획을 선택함
3-6. Cache & Buffer
MySQL 엔진의 성능을 향상시키기 위해 사용되는 메모리 기반 구성 요소
3-7. Query Execution Engine
옵티마이저가 결정한 실행계획대로 쿼리를 스토리지 엔진에 요청하는 역할
MySQL 엔진과 스토리지 엔진 간의 통신을 위해 Handler API 사용
→ 스토리지 엔진에 요청하는 과정을 핸들러 요청이라고함
4. Storage Engine
MySQL 엔진이 전달받은 쿼리 문장을 어떻게 실행할지에 대해 결정했다면,
실제 데이터를 디스크(Disk)에 저장하거나 디스크로부터 데이터를 불러오는 과정은 스토리지 엔진(Storage Engine)이 담당하게됨
이러한 스토리지 엔진은 여러 개의 종류가 있으며, 테이블 별로 원하는 스토리지 엔진을 바꿔서 사용할 수 있음
(MySQL 엔진은 변경 불가)
test_table의 스토리지 엔진으로 INNODB 엔진 선택
CREATE TABLE test_table (c1 INT, c2 INT) ENGINE=INNODB;대표적인 스토리지 엔진은 아래와 같음
4-1. InnoDB Engine
MySQL 8버전에서 사용되는 기본(default) 스토리지 엔진
트랜잭션(Transaction) 및 다중 버전 동시성 제어(MVCC, Multi Version Concurrency Control) 지원
4-2. MyISAM Engine
InnoDB가 기본 스토리지 엔진으로 사용되기 전까지 MySQL에서 사용되던 엔진, 트랜잭션과 동시성 제어를 지원하지 않음
4-3. Memory(Heap)
메모리 기반으로 데이터를 저장하는 스토리지 엔진
메모리 기반이기 때문에 시스템 재시작 시 데이터는 손실됨
그 외에도 다양한 스토리지 엔진이 존재하며, 스토리지 엔진이 MySQL 엔진과 통신하기 위해 사용되는 핸들러 API의 스펙을 구현할 경우, 개발자가 직접 스토리지 엔진을 생성하여 사용할 수도 있음
현재 사용 중인 스토리지 엔진의 종류 확인
SHOW ENGINES;