오늘은 MySQL 에서도 스토리지 엔진에 대해서 글을 작성해보려 한다.
먼저 간단하게 SQL 실행 순서를 살펴볼 것이다.
테이블을 구성할 때 자주 변동이 일어나는 데이터는 분리 해주는 것이 좋다. 이후 JOIN 을 통해서 사용하면 된다.
SQL 실행 순서

SELECT
name, age, sex, COUNT(*) AS cnt
FROM users
JOIN user_profiles
ON users.id = user_profiles.user_id
WHERE age >= 20
GROUP BY age, sex
HAVING COUNT(*) > 0
ORDER BY age DESC
LIMIT 5
JOIN 까지는 데이터 범위를 확인하고 → 그 다음부터는 데이터를 필터링하고(WHERE)
→ 압축한다.(SELECT)
실제로 MYSQL 서버에서의 동작 과정
SQL 처리되는 과정을 살펴보면 아래 와 같다.

- DB에 로그인 하면서 connection 을 1개 들고온다.
- MySQL 5.7 까지는 쿼리 캐시가 남아 있어서 메모리상에 저장되어 있는게 있다하면 그 값을 바로 리턴 (cache hit) → 서버 부하가 적다.
- MySQL 8.0 부터 쿼리 캐시 사라졌다.
- 사라진 이유: DB의 부하를 줄이기 위해 앞단에 두었는데 서비스가 커지다보면 캐쉬를 타면 안되는 경우가 많이 생긴다.(예를 들어 “조회수” → 캐쉬에 저장되어 조회수가 안올라간다.)
- 캐쉬를 피하기 위해 필요없는 쿼리를 넣다 보니 쿼리 파싱이 더 오래걸린다.
- 그래서 8.0 부터는 캐쉬가 필요하면 별도의 캐쉬 시스템을 사용하도록 하였다.
- 쿼리 캐시에 데이터가 없으면 cache miss 쿼리 파싱이 돌아간다. (위에서 본 SQL 순서대로 파싱)
- 파싱되면 어떤 테이블에 어떤 데이터를 조회할지 정리된다.
- 이후 전처리에서 위에서 파싱이 정리된 내용을 확인을 해준다.
- 예를 들어 이 테이블에 진짜 이 컬럼이 있는지 없는지
- DB 에 접근한 사용자가 이 테이블에 접근할 수 있는지 없는지
- 권한이나 validation 을 체크
- 이렇게 까지 권한 이랑 값 체크까지 하면 실행할 준비는 끝난 것이다.
- 하지만 그냥 바로 실행 되는게 아니라 optimization 에서 자동으로 쿼리를 최적화 해준다.
- 개발자가 작성했던 쿼리에 대해서 어떤식으로 하는게 효율적인지 자동 최적화
- 예를들어 SELECT 구문에 있지만 나중에 실행한다던가 이런 판단을 해줌
- 최적화를 끝내면 최종적으로 실행할 수 있는 execution plan 이 나온다.
- execution plan 을 실행
- execution plan 을 어떻게 실행하느냐?
- Disk 에 있는 Data 에 바로 접근하는게 아니라 Storage Engine 이라는 걸 통해서 API 호출 할 때 어떤 인터페이스를 통해서 실행
- 어떤 구현체를 통해서 API 호출 할 때 인터페이스인 Disk 에 접근
- Disk 에서 데이터를 가져온 다음에 결과 반환
중요포인트 : 우리가 쿼리를 파싱해서 실행이 될 때 실제 실행이 되는 물리적인 구현체는 Storage Engine 이다.
- 어떤 Storage Engine을 쓰느냐에 따라 성능이 좌우된다.
Storage Engine의 역할
- 물리적 저장 방식: 테이블 구조, index
- 데이터 읽고/쓰기
- 트랜잭션
- 데이터 무결성
- 성능 최적화
- 충돌 복구 및 백업
- 저장 공간의 효율성(Disk)
여기서 모든 Storage Engine 다 볼필요는 없다.
- MEMORY 는 껐다 키면 데이터 날라감
- 예를 들어 회원가입 했는데 껐다 키면 데이터 난라가서 회원가입 조차 안되어 있으면 안된다.
스토리지 엔진 종류와 차이점(InnoDB, MyISAM)

이번에 개발을 해볼 예정인 게시판 서비스에서는 InnoDB 사용
- 이유는 게시판을 쓰면 댓글을 작성해야하는데 댓글을 작성한다고 글을 조회 못하는 MyISAM 을 사용하면 사용자들이 답답함을 느낄 수 있다.
- 댓글 쓰기 경진대회로 이루어질 수 있다 ㅎ
그래서 요즘 서비스에서는 동시성 처리 때문에 InnoDB 를 많이 사용 한다.