DB 병목현상 발생 원인
동시 사용자의 증가로 인해 수 많은 요청에 대해 처리해야한다거나, 혹은 요청에 의한 응답으로 나가는 데이터 양의 증가, 비효율적인 SQL 발생 등이 원인이 될 수 있다.
이러한 병목은 단순히 애플리케이션 속도 저하로 끝나지 않고, 전체 서비스의 안정성과 사용자 경험에 치명적인 영향을 줄 수 있다.
DB 성능 개선을 위한 접근 방식
DB 성능을 개선하기 위해서는 다양한 방식들이 존재한다.
- SQL 튜닝
- 캐시 서버 활용(Redis)
- Master/Slave 구조
- 샤딩 (수평 분산)
- 하드웨어 업그레이드
문제의 상황마다 다르겠지만 이중에서 가장 먼저 만져줘야 하는 부분은 SQL 튜닝 부분이다. 적절한 인덱스를 생성하므로써 성능을 향상 시켜주는 것이 첫번째로 이뤄줘야 하고, 그 후 해결되지 않는 부분들에 대해서는 다른 방법을 갈구하면 된다.
"적절한 인덱스를 생성하기"가 왜 가장 먼저 일어나야 하냐면, SQL 튜닝은 별도의 인프라 작업이나, 구조 변경없이도 기존 시스템을 유지한채 성능을 향상 시킬 수 있는 가장 쉬운 방법이기 때문이다.
그리고 해당 방식이 "근본적인 해결 전략"이 될 가능성이 크기 때문이다. DB에서의 병목현상의 근본적인 원인은 대부분 비효율적인 SQL 또는 잘못된 인덱스 전략일 가능성이 높다. 해당 상태에서 서버만 확장하면 이는 비용만 확장하는 꼴이 될 수 있기 때문에, SQL을 추적하고, 인덱스를 잘못 생성하지는 않았는지에 대해 생각해볼 필요가 있다.
SQL 튜닝은 가장 경제적이며, 근본적인 성능 병목 해결 수단이다.
병목의 핵심: MySQL 구조의 이해
어떤 부분에서 MySQL의 성능을 많이 잡아먹는지, 어떤 요인이 주로 문제를 일으키는 지 파악할 수 있어야 한다. 그 원인을 파악하기 위해서는 MySQL 구조를 알아야 한다.

- 클라이언트가 DB에 요청을 보낸다
- MySQL 엔진에서 옵티마이저가 SQL문을 분석한 뒤 빠르고 효율적으로 데이터를 가져올 수 있는 계획을 세운다. 어떤 순서로 테이블에 접근할 지, 인덱스를 사용할 지, 어떤 인덱스를 사용할 지 등을 결정한다.(옵티마이저가 세운 계획은 완벽하지 않기 때문에 SQL 튜닝이 필요한다)
- 옵티마이저가 세운 계획을 바탕으로 스토리지 엔진에서 데이터를 가져온다.
- DB 성능에 문제가 생기는 원인은 스토리지 엔진으로부터 데이터를 가져올 때 발생한다.
- → 데이터를 찾는데 오래 걸리거나, 가져올 데이터가 너무 많아서 오래 걸린다.
- SQL 튜닝의 핵심은 스토리지 엔진으로부터 되도록이면 데이터를 찾기 쉽게 바꾸고, 적은 데이터를 가져오도록 바꾸는 것을 말한다.
- MySQL 엔진에서 정렬, 필터링 등의 마지막 처리를 한 뒤에 클라이언트에게 SQL 결과를 응답한다.
- DB 성능에 문제가 생기는 원인은 스토리지 엔진으로부터 데이터를 가져올 때 발생한다.
-> 옵티마이저가 SQL문을 먼저 분석(해당 SQL문을 분석해서 이러이러한 데이터를 요구하네? 그럼 이 데이터를 어떠한 순서로 가져와야 빠르게 효율적으로 가져올 수 있을까?를 분석하고 계획을 세움) → 그럼 그 계획에는 어떤 순서로 어떻게 테이블에 접근할 지 그리고 어떤 인덱스를 사용할지 같은 것들을 결정하게 된다.(근데 완벽하지는 않다는 것.)
병목은 대부분 InnoDB -> Storage 사이에서 발생한다.
데이터를 "어떻게" 찾고 "얼마나" 찾는지가 병목의 핵심이다.
여기서 "간단하게" 찾고 "1개"만 찾는다면 병목현상은 없을 것이다.
SQL 튜닝의 핵심
SQL 튜닝에 있어서 핵심은 2가지이다.
- 스토리지 엔진에서 데이터를 찾기 쉽게 바꾸기 -> 인덱스를 생성하여 찾기 쉽게 새로운 정렬을 구성하는 것이다
- 스토리지 엔진으로부터 가져오는 데이터의 양 줄이기 -> Join, limit, Where를 최적화 하는 것이다.
이 두 가지를 잘 수행하면 불필요한 디스크 접근을 줄일 수 있고, 전체 쿼리 속도는 비약적으로 향상된다.
'DB > SQL' 카테고리의 다른 글
| [MySQL] MySQL 성능 개선의 핵심, 인덱스 이해하기 (0) | 2025.03.29 |
|---|