공부/자바

SQL 튜닝

확두뇌 2024. 3. 5. 14:34

sql 튜닝

  1. 인덱스 사용하기
SELECT *
FROM orders
WHERE order_date > '2021-01-01'
ORDER BY order_id

CREATE INDEX idx_order_date ON orders (order_date);
CREATE INDEX idx_order_id ON orders (order_id);

  1. 적절한 join 사용하기
  2. 불필요한 join을 피하고 쿼리의 실행 속도를 향상시킬 수 있음
SELECT *
FROM orders
JOIN customers
ON orders.customer_id = customers.customer_id
WHERE orders.order_date > '2021-01-01'

대신

SELECT *
FROM orders
WHERE orders.order_date > '2021-01-01'
  1. 서브쿼리 최소화하기

서브쿼리 대신 join, union, exists등의 다른 방법을 사용하는 것이 좋음

SELECT *
FROM orders
WHERE customer_id IN (
  SELECT customer_id
  FROM customers
  WHERE gender = 'F'
)

대신

SELECT orders.*
FROM orders
JOIN customers
ON orders.customer_id = customers.customer_id
WHERE customers.gender = 'F'
  1. 쿼리 실행 계획 확인하기

mysql에서는 explain 키워드를 사용하여 쿼리 실행 계획을 확인할 수 있다.

EXPLAIN SELECT *
FROM orders
WHERE order_date > '2021-01-01'
ORDER BY order_id

쿼리 실행 계획은 쿼리가 어떻게 실행되는지에 대한 정보를 제공하므로, 성능을 분석하는데 유용함.

  1. 쿼리 성능 모니터링하기

쿼리 성능 모니터링을 통해 어떤 쿼리가 가장 많은 시간을 소모하는 지, 어떤 쿼리가 자주 실행되는지 등을 파악하여 성능 향상을 위한 대책을 수립할 수 있다. 데이터베이스 관리 시스템에서 제공하는 성능 모니터링 툴을 사용하거나, 쿼리 로그를 분석하여 쿼리 성능을 모니터링 하는 것이 좋다.

  1. 쿼리 최적화하기

where 절을 최적화하여 필요한 데이터만 검색하는 것이 좋다. 또한 쿼리가 자주 실행되는 경우에는 캐시를 사용하여 쿼리의 실행 속도를 높이는 것이 좋다.

SELECT *
FROM orders
WHERE order_date > '2021-01-01'
ORDER BY order_date DESC

대신

-- 인덱스를 사용한 최적화된 쿼리
SELECT *
FROM orders
WHERE order_date > '2021-01-01'
ORDER BY order_id DESC