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을 사용해 옵티마이저(쿼리엔진)의 행동을 파악할 때 아주 중요하게 사용된다 |