반응형

SQL 성능 확인

데이터베이스가 커지고 복잡해질수록 SQL 쿼리의 성능 최적화는 중요합니다. 효율적인 쿼리는 시스템의 성능을 유지하고, 자원을 절약하며, 사용자 경험을 개선합니다. 이 글에서는 SQL 성능 확인의 필요성과 함께, 성능을 확인하는 도구인 EXPLAINPROFILING의 사용법과 예시를 소개합니다.


1. SQL 성능 확인이 필요한 이유

1.1 성능 저하 문제

SQL 성능 문제는 데이터베이스가 대규모 데이터를 처리하거나 복잡한 조인을 실행할 때 발생합니다. 비효율적인 쿼리는 실행 속도를 느리게 하고, 서버 리소스를 과도하게 소모할 수 있습니다.

1.2 문제 조기 발견 및 해결

성능 확인 도구를 사용하면 다음과 같은 문제를 조기에 발견하고 해결할 수 있습니다:

  • 비효율적인 인덱스 사용: 적절한 인덱스가 없거나 잘못된 인덱스를 사용하는 경우.
  • 과도한 테이블 스캔: 필요한 데이터만 조회하지 못하고 전체 테이블을 읽는 경우.
  • 비효율적인 조인: 복잡한 조인 조건으로 인해 불필요한 계산이 이루어지는 경우.

1.3 최적화된 쿼리 작성

성능 확인 결과를 바탕으로 쿼리와 데이터베이스 구조를 최적화하여 자원 소모를 줄이고 응답 시간을 단축할 수 있습니다.


2. SQL 성능 확인 도구

2.1 EXPLAIN

EXPLAIN은 SQL 쿼리가 실행될 때 데이터베이스가 어떤 계획을 사용하는지 설명합니다. 이를 통해:

  • 어떤 인덱스가 사용되는지
  • 테이블 스캔 여부
  • 조인 순서와 방식

등을 알 수 있습니다.

2.2 PROFILING

PROFILING은 쿼리 실행 과정에서 어떤 작업이 수행되었는지와 각 작업에 소요된 시간을 상세히 보여줍니다.


3. EXPLAIN 및 PROFILING 사용법과 예시

3.1 EXPLAIN 사용법

아래는 EXPLAIN 명령어를 사용하는 기본 예시입니다.

EXPLAIN SELECT * FROM orders WHERE customer_id = 1;

 

EXPLAIN 결과 예시

id select_type table type possible_keys key key_len rows extra
1 SIMPLE orders ref customer_idx customer_idx 4 10 Using index
  • type: 쿼리 실행 방식. 가능한 최적화 순서: ALL (전체 테이블 스캔) → index → range → ref → const.
  • possible_keys: 사용할 수 있는 인덱스.
  • key: 실제 사용된 인덱스.
  • rows: 조회된 데이터의 대략적인 행 수.
  • Extra: 추가 작업 정보 (e.g., Using index는 효율적, Using temporary와 Using filesort는 비효율적).

3.2 PROFILING 사용법

1. PROFILING 활성화

SET profiling = 1;

 

 

2. 쿼리 실행

SELECT * FROM orders WHERE customer_id = 1;

 

 

3. 전체 프로파일 조회

SHOW PROFILES;

 

결과 예시

Query_ID Duration Query
1 0.000543 SELECT * FROM orders WHERE ...

 

4. 특정 쿼리의 상세 정보 조회

SHOW PROFILE QUERY FOR QUERY_ID;
 

결과 예시

Status Duration
Starting 0.000023
Checking permissions 0.000011
Opening tables 0.000134
Sending data 0.000375
End 0.000001

4. 예시: 주문 데이터를 조회하는 SQL 성능 분석

요구 사항

특정 고객의 주문 데이터를 빠르게 조회하는 SQL 쿼리를 작성 및 분석합니다.

데이터베이스 스키마

CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_id INT,
    order_date DATE,
    amount DECIMAL(10, 2),
    INDEX(customer_idx) (customer_id)
);

 

문제 발견

다음과 같은 쿼리를 실행합니다:

EXPLAIN SELECT * FROM orders WHERE customer_id = 1;
 

결과:

idtabletyperowsExtra

id table type rows Extra
1 orders ALL 5000 Using where
  • type이 ALL인 경우 전체 테이블 스캔이 발생합니다.

해결 방법

customer_id 컬럼에 적절한 인덱스를 추가합니다:

CREATE INDEX customer_idx ON orders(customer_id);
 

다시 쿼리를 실행하면:

EXPLAIN SELECT * FROM orders WHERE customer_id = 1;
 

결과:

idtabletyperowsExtra

id table type rows Extra
1 orders ref 10 Using index

PROFILING 결과 확인

SET profiling = 1;
SELECT * FROM orders WHERE customer_id = 1;
SHOW PROFILES;
SHOW PROFILE QUERY FOR QUERY_ID;
  • Duration에서 Sending data 시간이 대폭 감소했음을 확인할 수 있습니다.

5. 결론

SQL 성능 확인은 데이터베이스의 효율성을 극대화하고 시스템 성능을 유지하는 데 필수적입니다.
EXPLAIN은 쿼리 실행 계획을 분석하는 데 유용하며, PROFILING은 실행 과정의 세부적인 정보를 제공합니다.

 

이 두 도구를 적절히 활용하면 성능 병목 지점을 파악하고 최적화된 쿼리를 작성할 수 있습니다.
이를 통해 시스템의 응답 시간을 개선하고 서버 리소스를 효율적으로 관리할 수 있습니다.

반응형

'개발 부트캠프 > 데이터베이스' 카테고리의 다른 글

[DB] 스토어드 프로시저(Stored Procedure)  (0) 2024.12.02
[DB] 인덱스(Index)  (0) 2024.12.02
[DB] ERD  (2) 2024.11.27
[DB] 정규화  (0) 2024.11.27
[DB] 데이터베이스 = 파일이다.  (0) 2024.11.27

+ Recent posts