시스템의 성능이 저하된다면 네트워크, OS 및 애플리케이션 설정 등 다양한 부분을 의심해볼 수 있을 것이다. 하지만 앞서 말한 요소들은 한번 최적화를 거치고 나면 추후 문제를 발생시키지 않을 가능성이 높다.
하지만 시간이 지날수록 우리의 데이터베이스에 쌓이는 데이터는 늘어나기 때문에 우리가 어떤 SQL을 작성해서 데이터를 가져오느냐에 따라 성능에 치명적인 영향을 미칠 수 있게 된다.
그래서 효과적인 쿼리를 작성하는 것이 필수적이며, 올바른 SQL은 데이터베이스 성능을 향상시킬 수 있다.
MySQL의 EXPLAIN
이라는 명령어를 사용하면 쿼리가 실행될 때 데이터베이스가 어떻게 데이터를 찾아가는지 일련의 과정을 알 수 있다.
💡 Oracle 데이터베이스는
EXPLAIN PLAN
이라는 명령어를 지원한다
예를 들어, Orders 라는 테이블에서 user_id가 100인 주문을 선택한다고 가정해보자. 아래와 같이 EXPLAIN
을 사용하면 데이터베이스 엔진은 쿼리 실행을 시뮬레이션하게 되는데, 이 시뮬레이션은 실제 쿼리를 실행하지 않고 자세한 보고서를 생성한다
> EXPLAIN SELECT * FROM orders WHERE user_id = 100;
결과:
EXPLAIN
은 다음과 같은 항목을 포함한다
id
: query 실행 단계의 식별자select_type
: 쿼리에 따라 SIMPLE, SUBQUERY, UNION등의 타입이 존재한다type
: 테이블에서 어떻게 행이 데이터를 가져올 것인가에 대한 접근방법을 나타낸다 (ex, all=전체스캔, index=index스캔, ref=여러개의 행 fetch)possible_keys
: 사용될 수 있는 잠재적 인덱스key
: MySQL이 선택한 키(인덱스)ref
: 행을 선택하기 위해 키와 함께 사용되는 열 또는 상수rows
: 쿼리를 실행할 때 MySQL이 검사할 것으로 예상되는 예상 행 수extra
: 임시 테이블 또는 파일 정렬 사용과 같은 추가 세부 정보(옵티마이저의 행동을 파악할 때 중요하다)