Mysql 쿼리 동작 순서
1. 쿼리 파서 동작
select id from team where team_name = '드림팀';
처럼 sql 문을 실행하면 쿼리 파서가 각 단어를 토큰으로 분리한 뒤 문법적 오류를 체크합니다.
2. 파서 트리 구성
문법적 오류가 없을 경우 파서 트리 형태로 구성합니다.
3. 전처리기 동작
이 또한 오류를 체크합니다. team 이라는 테이블이 존재하는지, 사용자가 team 테이블에 접근이 가능한지를 파악합니다.
4. 옵티마이저 동작
옵티마이저는 최적화된 실행계획을 실행하는데 도움을 줍니다. 기본적으로 풀스캔을 하게 되지만 인덱싱을 주어 실행계획을 변경할 수 있습니다.
Mysql 엔진의 목적
Mysql 엔진의 목적은 요청 쿼리에 대해서 어떻게 실행할지 결정하는 역할
스토리지 엔진
디스크와 통신을 하며 사용자 요청에 따라 데이터를 읽어오거나 가공하는 역할
Mysql이 지원하는 기본 엔진은 InnoDB입니다.
버퍼 풀
버퍼 풀은 메인 메모리의 한 영역으로 테이블과 인덱스 데이터를 캐싱해두는 공간입니다.
즉, 사용자 요청에 필요한 데이터가 버퍼 풀에 등재돼 있다면, 디스크 I/O를 하지 않고 버퍼 풀에 등재된 내용을 사용자에게 전달해 줍니다.
이 때 데이터들은 페이지 단위로 데이터가 관리가 됩니다. 그 이유는 디스크의 데이터 저장 단위가 페이지기 때문입니다.
또한, 이 조회 과정에서 효율을 높이기 위해 페이지들은 링크드 리스트로 관리가 되고, 링크드 리스트는 LRU(Least Recently Used) 알고리즘을 활용합니다.
조회한 페이지가 없을 경우에는 Old Sub SET의 마지막 요소를 탈락(제거)하고 Middle Point에 페이지를 추가합니다.
조회한 페이지가 있을 경우에는 존재하는 페이지를 New Sub SET의 헤드로 이동시킵니다.
Least Recently Used: 가장 최근에 가장 많이 사용되지 않은 데이터들이 탈락하는 알고리즘
New Sub SET: 링크드 리스트에서 비교적 최근에 사용된 페이지들이 모인 공간
Middle Point: Nesw Sub SET과 Old Sub SET이 맞닿는 공간
Old Sub SET: 링크드 리스트에서 비교적 최근에 덜 사용된 페이지들이 모인 공간
버퍼풀은 이렇게 디스크 I/O 횟수를 줄이고 효과적으로 데이터를 읽는데 도움을 줍니다.
MVCC
InnoDB가 MVCC를 지원하는 이유
이전에 사용하던 MyISAM의 경우 락기능을 통해서 동시성을 처리했습니다.
한 사용자가 '드림팀' 에 접근해서 락을 건 상태로 작업이 진행되고 있으면,
다른 사용자가 접근하려면 이 락이 풀릴 때까지 기다려야만 했습니다.
즉, 대량 요청에 따른 성능이 떨어진다는 문제점이 발생했습니다. 이러한 문제점으로 인해 InnoDB는 MVCC를 지원하게 됐습니다.
MVCC란
MVCC(Multi-Version Concurrency Control)는 원본 데이터를 여러 버전으로 관리하여 동시성을 처리하는 기술입니다.
InnoDB는 MVCC를 구현하기 위해서 언두 로그를 활용했습니다.
예시를 들면,
- 사용자 A가 트랜잭션을 시작하고, '드림팀'을 '홍철팀`으로 변경했습니다. 아직 사용자 A의 요청이 끝나지 않았습니다.
- 사용자 B가 트랜잭션을 시작하고, 팀이름을 '드림팀'으로 검색했습니다.
이때 사용자 B의 트랜잭션 격리 수준에 따라 다른 결과를 가져오게 됩니다.
Read_uncommited라면 버퍼 풀에 있는 정보를 불러 오기 때문에 아무런 데이터 결과 값을 받지 못할 것입니다.
Read_commited이거나 Repeatable_read라면 언두 로그를 조회해서 '드림팀'에 대한 정보를 받아 옵니다.
이처럼 MVCC는 여러버전의 데이터를 관리하여 잠금이 걸려져 있더라도 읽기는 가능하도록 도와주는 기술입니다.
Mysql의 경우 MVCC는 기본적으로 Repeatable_read에서 활용됩니다.
참고자료
https://www.youtube.com/watch?v=w27fZGbtvZ0&list=PLgXGHBqgT2TvpJ_p9L_yZKPifgdBOzdVH&index=3
https://shardingsphere.apache.org/document/5.1.1/en/reference/sharding/parse/
'Database' 카테고리의 다른 글
Clustered Index / Non-Clustered Index (0) | 2023.12.01 |
---|---|
MySQL 실행계획 (1) | 2023.10.15 |
Unknown system variable 'transaction_isolation' (0) | 2023.09.14 |
B-Tree 인덱스 (0) | 2023.09.14 |
NoSQL (0) | 2023.09.14 |