Connection Pool

  • 이전에 배웠던 Thread Pool 처럼 데이터 베이스와의 연결(Connection)에도 Pool을 만들어 효율적으로 재활용 하는 기술을 말한다.

max_connections

  • max_connections 란 생성가능한 새로운 연결(Connection) 수를 의미하며 이로인해 연결들을 효율적으로 관리를 하지 않으면 문제가 생길 수 있다.

  • max_connections를 넘기 시작하면 아무도 데이터베이스에 접근을 할 수 없게 될 수 있다.

  • max_connections는 시스템이 실제로 핸들링 가능할 수 있는 설정 값으로 세팅을 해야한다!
    ( 임의로 수정해도 의미가 없음 )

  • Prisma와 같은 ORM에 탑재되어 사용되고 있는 기능이다.

File Descriptor

  • 프로세스가 파일이나 다른 입출력 자원(예: 파이프, 네트워크 소켓 등)을 다룰 때 사용하는 고유 식별자

  • DB와의 입력/출력 연결(Socket)이 늘어날 수록 선형적으로 File Descriptor가 증가하여 자원 부족 문제가 발생한다

쿼리 실행 계획

  • SQL에서 EXPLAIN 명령어를 통해 쿼리 엔진이 주어진 쿼리를 어떻게 처리하는지 확인할 수 있음 이러한 정보들을 실행 계획이라 함

  • 이러한 쿼리 실행 계획들을 확인하여 쿼리를 어떻게 최적화할 지 생각해볼 수 있음

EXPLAIN 필드

Field Description
id SELECT에 붙은 번호를 말하며 실행 단위를 식별해준다.
MySQL은 조인을 하나의 단위로 실행하기 때문에 조인만 수행하는 쿼리에서는 id는 항상 1이 된다.
table 어떤 테이블에 대한 접근을 표시하고 있는지는 table 필드에 표시되어 있음
select_type select_type은 항상 SIMPLE 이 되며, 복잡한 조인을 해도 SIMPLE이 됨
서브 쿼리나 UNION이 있으면 id와 select_type이 변함
type 접근 방식을 표시하는 필드 접근 방식은 테이블에서 어떻게 행이 데이터를 가져올 것인가를 가리킨다
접근 방식은 대상 테이블로의 접근이 효율적일지 여부를 판단하는 데 아주 중요한 항목으로 접근 방식 가운데도 주의가 필요한
ALL, index, ref_or_null이 있으며 ALL, index 두 가지는 테이블 또는 특정 index가 전체 행에 접근하기 때문에
테이블 크기가 클수록 효율이 떨어지게 된다
ref_or_null의 경우 NULL이 들어있는 행은 index의 맨 앞에 모아서 저장하지만 그 건수가 많으면 MySQL 서버의 작업량이 방대해진다.

추가로 설명하자면 ALL 이외의 접근 방식은 모두 index를 사용하기에 접근 방식이 ALL 또는 index 자체인 경우
그 쿼리로 사용할 수 있는 적절한 index가 없다는 의미일 수도 있다는 것이다!
possible_keys 이용 가능성 있는 index의 목록을 나타낸다
key possible_keys 필드는 이용 가능성 있는 index의 목록 중에서 실제로 옵티마이저가 선택한 index가 key가 된다
key_len 선택된 index의 길이를 의미한다
ref key 칼럼에 나와 있는 index에서 값을 찾기 위해 선행 테이블의 어떤 칼럼이 사용 되었는지를 나타낸다
rows 이 접근 방식을 사용해 몇 행을 가져왔는가를 표시하며, 최초에 접근하는 테이블에 대해서 쿼리 전체에 의해 접근하는 행 수,
그 이후에 테이블에 대해서는 1행의 조인으로 평균 몇 행에 접근했는가를 표시한다.
( 단, 어디까지나 통계 값으로 계산한 값이므로 실제 행 수와 반드시 일치하지 않는다 )
filtered 행 데이터를 가져와 WHERE 구의 검색 조건이 적용되면 몇 행이 남는 지를 표시한다
( 이 값도 통계 값 바탕으로 계산한 값이므로 현실의 값과 반드시 일치하지 않는다 )
extra Extra 필드는 옵티마이저(쿼리엔진)가 동작하는데 대해서 우리에게 알려주는 힌트로
이 필드는 EXPLAIN을 사용해 옵티마이저(쿼리엔진)의 행동을 파악할 때 아주 중요하게 사용된다

Reference

Useful Guide