MySQL에서는 각 요청을 어떻게 처리하는지 정리해 보고자 한다.
Real MySQL 8.0 책을 읽고 정리한 내용이다.
스레드 기반
으로 작동Foreground
/ Background
Thread로 구분전통적인 스레드 모델에서는 Connection 별로 포그라운드 스레드가 하나씩 생성되고 할당된다.
Thread pool에서는 Connection과 포그라운드 스레드는 1:1관계까 아닌, 하나의 Thread가 여러 개의 Connection 요청을 전담한다.
Foreground Thread ( Client Thread )
Thread cache
에 설정된 값이 있으면, 종료thread_cache_size
Background Thread
MyISAM
InnoDB
로그를 디스크로 기록
버퍼 풀의 데이터를 디스크에 기록
Foreground Thread는 데이터 버퍼 or 캐시까지만 처리
, 버퍼로부터 디스크까지 기록하는 작업은 Background Thread
가 처리
중요 ! ( 후에 InnoDB 버퍼 풀에 해당 내용과 관련된 내용이 나온다. )
💡 MyISAM은 io작업도 포그라운드가 진행하기 때문에, bulk insert가 안된다.
InnoDB는 백그라운드가 진행하기 때문에 데이터 파일로 완전히 저장될 때 까지 기다리지 않아도 된다.
Threads_created / Connections 값이 1% 이상이면 thread_cache_size를 증가시켜야 한다고 한다.
MySQL은 Thread Pool이 아닌 Connection 당 Thread로 처리한다.
( Thread Cache 사용 )
=> Enterprise 버전에서는 Thread Pool 제공
내부적으로 사용자의 요청을 처리하는 스레드 개수를 줄여서
동시 처리되는 요청이 많다 하더라도 서버의 CPU가 제한된 개수의 스레드 처리에만 집중
할 수 있게 하여 자원 소모를 줄이는 것이 목적
기본적으로 CPU 코어의 개수만큼 스레드 그룹 생성
스레드 풀이 처리 중인 작업이 있는 경우 thread_pool_oversubscribe
에 설정된 개수만큼 추가로 더 받아들여 작업
모든 스레드가 일을 처리하고 있을 경우, 새로운 스레드를 추가
할지, 완료를 기다릴지
판단
thread_pool_stall_limit
에 설정된 ms만큼 대기했다가, 스레드 추가
전체 스레드 갯수는 thread_pool_max_threads
수를 넘을 수 없다.
선순위 후순위 큐
를 이용해 먼저 시작된 SQL을 빨리 처리해주면 lock을 빠르게 해제하고, 경합을 낮춰 성능 향상 가능.
그렇다면, 둘 간의 차이는 무엇일까?
MySQL에서는 Query Cache도 삭제되었고, Thread Cache를 이용하므로 Connection 당 Thread가 생성된다고 볼 수 있다.
DB를 여러개 사용할 경우, Thread 수가 감당할 수 없게 만들어지고 똑같은 쿼리라도 각자 메모리를 먹는다.
그래서 ProxySQL을 사용한다.