보자보자 my sql 아키텍쳐에 대해 알아보자~
아주 상세히는 아니고 흐름을 이해 할 수 있을 정도로만 간단히 정리해 볼 생각이고,
real my sql 8.0 을 찍먹 했던게 이해하는데 꽤나 도움 되었던 것 같다. 깊게 공부하고 싶다면 추천~

전체적인 아키텍쳐와 흐름은 위와 같고 아래에서 열심히 뜯어보겠다.

전체적인 구조는 <My SQL 엔진> + <스토리지 엔진> 이다.
My SQL 엔진
MySQL 엔진은 요청된 SQL 문장을 분석하거나 최적화하는 등 DBMS의 두뇌에 해당하는 처리를 수행한다.
✔️ Connection/thread handling
클라이언트로 부터 접속 및 쿼리 요청을 처리한다.
✔️ Parser
사용자가 날린 쿼리를 파싱하고 파싱된 쿼리 트리 등을 생성한다.
✔️ PreProcessor
SQL 문법검사, 객체 존재 및 접근 권한 확인, 쿼리 구조 검사, 쿼리 처리 안정성 및 효율성 향상, 데이터베이스 보안 강화, 쿼리튜닝 및 실행 계획 지원 등을 한다.
✔️ Query cache
한번 날린 쿼리는 캐싱해 놓는다. 메모리가 부족하지 않다면 계속 저장해 놓지만 계속 쌓을 수 많은 없으니 적절히 덮어쓴다.
✔️ Optimizer
쿼리의 최적화된 실행을 계획한다.
sql 에서 key 는 인덱스라고 할 수 있으며, key를 통해 해시테이블에서 데이터를 찾을 수도 있고 디스크에서 데이터를 찾을 수도 있는데 어디에서 찾는게 더 빠른지 효율적인지 등을 알고 있는 것이 Optimizer 이다. 또 쿼리를 어디서 부터 실행하는 것이 좋은지 등을 결정하는 것도 Optimizer이다.
스토리지 엔진
실제 데이터를 디스크 스토리지에 저장하거나 디스크 스토리지로부터 데이터를 읽어오는 부분은 스토리지 엔진이 전담한다.
InnoDB 엔진, MyISAM엔진, Memory 엔진.. 등 여러 엔진이 있지만 대표적인 두가지만 다뤄보려고 한다.
✔️ InnoDB 엔진
트랜잭션에 안전한 테이블을 제공하는 트랜잭션-세이프 스토리지 엔진이다.
모든 5.0 바이너리 배포판에 디폴트로 포함되어있다.
다수의 사용자 동시접속과 퍼포먼스가 증가하여 대용량 데이터를 처리할 때 최대의 퍼포먼스 내도록 설계 되었다.
row level locking 을 지원한다.
-> 높은 퍼포먼스가 필요한 대용량 사이트에 적합하다.
✔️ MyISAM
비 - 트랜잭션 - 세이프 테이블을 관리한다.
전체 문장 검색 능력 뿐 아니라, 고-성능 스토리지 및 복구 기능을 제공한다.
테이블과 인덱스를 각각 분리된 파일로 관리한다.
항상 테이블에 ROW COUNT 를 가지고 있어 SELECT count(*) 과 SELECT 명령시 빠른 속도를 지원한다.
low level locking 을 지원하지 못한다.
-> 블로그라던지, 게시판 처럼 한사람이 글을 쓰면 다른 많은 사람들이 글을 읽는 방식에 최적의 성능을 발휘한다.
❓Row-Level-Locking
행 수준의 잠금이다.
행 수준의 잠금은 한 테이블 내의 하나의 행을 읽고, 수정할 때 다른 행들에 대한 액세스는 허용될 수 있는 잠금이다.
반대로 테이블 수준의 잠금인 Tabel-Level-Locking 도 존재한다. (MyISAM)
❓풀텍스트 인덱스
긴 문자의 텍스트 데이터를 빠르게 검색하기 위한 MySQL의 부가적인 기능이다.
첫 글자 뿐아니라 중간의 단어나 문장으로도 인덱스를 생성해 주기 때문에, 전체 텍스트 인덱스를 통해 순식간에 검색 결과를 얻을 수 있다.
스토리지 엔진중 innodb와 myisam 만 지원한다.
Query Cache

MySQL 처리 과정에서 쿼리문이 실행되는 과정에서 Query cache에 처음과 마지막에 둘다 들린다.
처음에는 캐시된 결과가 있는지 확인하기 위함이고, 마지막은 쿼리의 결과를 캐시하기 위함이다.
쿼리의 결과가 너무 크다면 어떻게 될까?? id 의 주소만 캐시하면 된다.
id 변경이 일어나거나 delete되었을때, insert 되었을때 는 해당 캐시 결과를 전부 expire시킨다.
mysql 이나 postgresql은 모든 부분을 expire 하도록 동작하지만, oracle은 수정된 해당 부분만 insert를 시켜서 저장한다.
(oracle 좀 더 효율적이라고 볼수 있다. 하지만 mysql 등이 이와 똑같이 하려면 비용이 많이 들기때문에 쉽지않다)
전체적인 흐름

클라이언트가 쿼리를 보내면서 처리를 요청하면,
캐싱 되어있는 지 확인하고 캐싱되어있지 않으면
parser가 해당 쿼리를 파싱하여 쿼리 파싱 트리를 만들고
전처리기는 트리를 이용하여 쿼리 실행 필요한 전처리를 진행하며,
옵티마이저는 해당 쿼리에서 가장 효율적인 쿼리 실행 계획을 짜고
쿼리 실행엔진이 API 핸들러를 통하여 스토리지 엔진을 통해 데이터(결과)를 가져온다.
마지막에 해당 쿼리를 캐싱하고 클라이언트에게 결과를 전달한다.
'Dev > SQL' 카테고리의 다른 글
| [MySQL] Fulltext Index (0) | 2025.05.08 |
|---|
