MySQL 구조는 왜 갑자기 파악하나요?
→ 어떤 부분에서 MySQL의 성능을 많이 잡아 먹는지, 어떤 요인이 주로 문제를 일으키는 지 파악할 수 있어야 한다. 그 원인을 파악하기 위해서는 MySQL 구조를 알아야만 한다.
✅ MySQL의 아키텍처
MySQL의 아키텍처를 간단하게 표현하자면 위와 같다. 이 아키텍처에서 SQL문이 어떻게 실행되는 지 과정을 알아보자.
클라이언트가 DB에 SQL 요청을 보낸다.
MySQL 엔진에서 옵티마이저가 SQL문을 분석한 뒤 빠르고 효율적으로 데이터를 가져올 수 있는 계획을 세운다. 어떤 순서로 테이블에 접근할 지, 인덱스를 사용할 지, 어떤 인덱스를 사용할 지 등을 결정한다.
(옵티마이저가 세운 계획은 완벽하지 않다. 따라서 SQL 튜닝이 필요하다.)
옵티마이저가 세운 계획을 바탕으로 스토리지 엔진에서 데이터를 가져온다.
(DB 성능에 문제가 생기는 대부분의 원인은 스토리지 엔진으로부터 데이터를 가져올 때 발생한다. 데이터를 찾기가 어려워서 오래 걸리거나, 가져올 데이터가 너무 많아서 오래 걸린다. SQL 튜닝의 핵심은 스토리지 엔진으로부터 되도록이면 데이터를 찾기 쉽게 바꾸고, 적은 데이터를 가져오도록 바꾸는 것을 말한다.)
MySQL 엔진에서 정렬, 필터링 등의 마지막 처리를 한 뒤에 클라이언트에게 SQL 결과를 응답한다.
✅ SQL 튜닝의 핵심
자, 다시 한 번 정리하자. SQL 튜닝에 있어서 핵심은 2가지이다.
스토리지 엔진에서 데이터를 찾기 쉽게 바꾸기
스토리지 엔진으로부터 가져오는 데이터의 양 줄이기
그럼 이 2가지를 어떻게 해결할 수 있을까?
여러가지 방법이 많지만 가장 많이 활용되는 방법이 인덱스 활용이다. 인덱스가 어떤 개념이길래 위 2가지 문제를 해결할 수 있는 지 알아보자.
단순히 인덱스만 적용한다고 해서 무조건 해결되는 게 아니다. 인덱스를 ‘적절하게’ 활용해야만 DB 성능이 개선된다. 이 방법에 대해 깊이 있게 다루기 전에 ‘인덱스’라는 개념에 대해 제대로 한 번 정리하고 넘어가자.