본문 바로가기
컴퓨터공학/데이터베이스

[MySQL] Query 성능 높이는 팁

by 독서왕뼝아리 2023. 9. 8.

Query 튜닝

Index 전략을 사용하기

인덱스는 데이터베이스 성능 최적화에 필수적인 요소다. PK나 JOIN, WHERE 자주 사용되는 컬럼 같은 컬럼에 반드시 인덱스를 생성하자.

 

하지만 과도한 인덱스는 부정적인 영향(쓰기 성능 느려짐, 메모리 낭비)을 주기 때문에 전략적으로 필수적인 인덱스를 만들어 사용해 관리하자.

 

Predicate 절에서 함수 사용을 피하라

SELECT * FROM TABLE1 WHERE UPPER(COL1)='ABC'

UPPER() 같은 함수를 사용하게 되면 데이터베이스는 인덱스를 사용하지 못하게 된다. 함수 기반 인덱스를 생성하거나, 컬럼 커스텀을 이용해야 한다.

 

Predicate 절에서 와일드카드(%)로 시작하는 조건을 피하라

SELECT * FROM TABLE1 WHERE COL1 LIKE '%ABC'

와일드카드는 풀스캔을 야기한다. 사용하지 않는 것이 최선의 방법!

 

불필요한 컬럼을 조회하지 마라

(SELECT *) 같이 사용하지 말라는 뜻

항상 필요한 컬럼만 SELECT 절에 명시하자.

 

Outer Join 대신 Inner Join을 사용하라

불필요하게 레코드의 개수가 많아지게 된다. Outer Join은 항상 필요할 때만 사용하자. 

 

Outer Join과 Inner Join 차이
Outer Join은 키워드(Right, Left, Full ...)에 따라 달라지긴 하지만 합집합 기반

 

DISTINCT와 UNION은 필요할 때만 사용하라

특별한 이유없이 사용한다면 원치 않는 정렬이 발생해 성능에 영향을 미친다.

+ UNION보다 UNION ALL를 사용하는 것이 더 향상된 성능을 보여준다.

 

ORDER BY 사용하는 위치가 중요하다.

정렬을 수행하는 강력한 기능이기 때문에 성능에도 영향을 미친다. 서브쿼리 처럼 1차적으로 사용되는 데이터가 정렬을 수행할 경우 복잡성을 더하기 때문이다.

 

Sub Query 최적화 하기

The most important advice I can give you about subqueries is that you must prefer a join where possible, at least in current versions of MySQL.

최소한 현재 MySQL(8.0) 버전에선 Sub Query보다는 ❤️JOIN❤️을 사용하는 것을 강력하게 추천한다.

 

하지만 서브쿼리도 최적화할 예정, 완벽한 대안은 아니라는 것! 

 

Query Cache 튜닝

성능 측정에서 또 다른 중요한 방식은 캐싱하는 것! MySQL은 쿼리 캐싱을 제공한다. 반복되는 호출을 할 때 MySQL 쿼리 캐시를 이용해 빠르게 응답할 수 있다. 

 

MySQL에서 쿼리 캐시를 이용하려면 몇 가지 세팅이 필요하다.

1. 쿼리 캐시가 지원되는지 확인하기

SHOW VARIABLES LIKE 'have_query_cache';

-- 가능하다면 아래와 같은 결과가 나온다
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| have_query_cache | YES   |
+------------------+-------+

2. 캐시 사이즈와 타입을 세팅하자.

기본 40KB 부터 최대 32MB까지 캐시 사이즈를 설정할 수 있다. 

SET GLOBAL query_cache_size = 40000;

캐시 타입은 연결에 따라서 결정된다(??) 아래와 같이 쿼리 캐시를 disable 할 수 있다.

SET SESSION query_cache_type = OFF;

 

Memcached 사용하기

유우명한 캐싱 오픈소스 플러그인

 

Application-Level Caching 

in-memory 같은 캐싱을 어플리케이션 계층 캐싱이라고 한다. 데이터베이스에 자주 접근하는 것을 막는다.

 

같은 데이터를 자주 접근하거나, 변화가 거의 없는 데이터에서 복잡한 연산을 수행해야 하는 데이터에 대해서 유용하다.

 

 

MySQL 성능 분석 모니터링 툴

MySQLTuner, VividCortex, MySQL Workbench 등등...

 

 

참고

위 내용 외에도 보안, 하드웨어 등으로 성능 높이는 방법도 나와 있습니다.

https://www.cloudways.com/blog/mysql-performance-tuning/

https://www.cloudways.com/blog/how-to-join-two-tables-mysql/#whatjoin