Database

쿼리 Query 최적화 및 튜닝

라임오렌지원 2022. 8. 23. 23:43

쿼리 최적화의 필요성

웹사이트 전문가 제이콥 닐슨은 응답 속도에 따른 유저 경험을 다음과 같이 평가한다.

- 0.1초 : 즉각적인 응답이라는 느낌

- 1초 : 지연을 감지하고 컴퓨터가 결과를 처리하고 있다는 느낌을 받지만, 아직 스스로 제어할 수 있다고 느낌

- 10초 : 사용자가 집중력을 유지할 수 있는 한계

- 10초 이상 : 유저의 신경이 돌아오기 쉽지 않음

 

따라서, 보통 10초의 유저 경험은 사이트를 즉시 떠나게 한다고 말한다.

API 콜의 지연이 유저경험에 지장을 준다면, 쿼리 최적화를 고려해볼 수 있다.

 

 

 

쿼리 최적화 및 튜닝 기술

1. Use Column Names Instead of * in a SELECT Statement

테이블에서 몇 개의 컬럼만을 조회하는 경우라면, SELECT * 을 사용할 필요가 없다.

필요한 일부 컬럼만을 선택함으로써 결과 테이블의 크기를 줄이고 네트워크 트래픽을 감소시킴으로써 쿼리의 평균 속도를 높일 수 있다.

 

 

2. Avoid including HAVING clause in SELECT Statement

Havaing 절은 모든 열이 선택된 이후에 필터를 위해 사용된다.

SELECT 문에서는 HAVING 절이 불필요하다.

이것은 최종 테이블에서 모든 열들을 파싱하면서 HAVING 조건에 충족되지 않는 열들을 필터링한다.

 

 

3. Eliminate Unnecessary DISTINCT Conditions

테이블에 Primary Key를 가지고 있으면, DISTINCT를 사용할 필요가 없으므로 쓰지 않는다.

DISTINCT를 사용하면 정렬하는 과정이 들어가기 때문에, Query 속도가 상당히 저하된다.

 

 

4. Un-nest SubQueries

중첩된 쿼리를 조인조건으로 재작성하는 것은 효율적인 실행과 효과적인 최적화를 불러일으킨다.

일반적으로 서브쿼리를 푸는 것은 ANY, ALL, EXISTS 등이 사용되는 한 개의 테이블에서 처리된다.

 

 

5. Consider using an IN predicate when querying an indexed column

IN-list 는 index된 검색을 위해 활용될 수 있으며, Optimizer는 Index의 정렬 순서와 일치하도록 IN-list를 정렬하여 보다 효율적인 검색을 수행할 수 있다. IN-list에는 상수 또는 쿼리 블록이 실행되는 동안 일정한 값만 포함해야 한다.

 

 

6. Use EXISTS instead of DISTINCT when using table joins that involves tables having one-to-many relationships

DISTINCT 키워드는 테이블의 모든 열을 선택한 후에 중복되는 것들을 파싱하는 형태로 작동한다. 만약 서브쿼리와 함께 EXISTS 키워드를 사용한다면, 전체 테이블을 조회하는 것을 피할 수 있다.

 

 

7. Try to use UNION ALL in place of UNION

UNION 문은 중복된 열의 조재 유무에 상관없이 열을 선택할 때 중복 검사를 하지만 UNION ALL은 중복검사를 하지 않으므로, UNION 보다는 UNION ALL을 사용하는 것이 빠르다.

 

 

8. Avoid using OR in join conditions

조인 조건에 'OR' 을 사용할 때마다 쿼리는 최소한 2배 이상 느려진다.

OR 문을 사용하는 경우에는 Index 를 활용한 검색을 하지 못하고, Full-Scan 을 하기 때문

 

 

9. Avoid functions on the right hand side of the operator

Functions 또는 Methods 는 SQL 쿼리에서 자주 함께 사용된다.

집계 함수 기능을 제거하여 쿼리를 재작성하는 것은 성능을 상당히 높여줄 것이다.

 

 

10. Remove any redundant mathematics

SQL 문을 작성하다 보면 수학 연산을 수행해야 할 때가 있다.

수학연산은 매번 열을 찾아서 연산을 다시 하므로, 부적절하게 사용된다면 성능을 상당히 저하시킬 것이다.

따라서 SQL 문에서 불필요한 수학 연산을 제거하는 것은 속도를 빠르게 할 것이다.

 

 

 

튜닝절차

1. 일단 조회

    - 조회 건수, fetch time / duration time 등 확인

2. 개선 대상 파악

    - 문제가 되는 조회쿼리 확인

    - 실행 계획 확인

    - 조건절 컬럼, 조인/서브쿼리 구조, 정렬 등 확인

    - 인덱스 현황 파악

3. 개선

 


참고사이트

 

https://mangkyu.tistory.com/52

 

[Database] 쿼리 Query 최적화 및 튜닝 기술

이 내용은 아래의 정보에 해당하는 논문을 요약한 것입니다. 논문 제목: Query Optimization Techniques - Tips For Writing Efficient And Faster SQL Queries 저자 : Jean HABIMANA 출판된 저널/컨퍼런스명: I..

mangkyu.tistory.com

 

https://sihyung92.oopy.io/database/mysql-query-plan

 

쿼리 최적화 1. 실행 계획

들어가며

sihyung92.oopy.io

 

728x90

'Database' 카테고리의 다른 글

[Mysql] on duplicate key update  (0) 2023.08.24
[MySQL] 테이블 생성문에 timestamp & index사용하기  (0) 2022.11.28
슬레이브(Slave)란?  (0) 2022.11.24
MySQL 인덱스  (0) 2022.09.02
Query Between 과 >=, <= 성능 차이  (2) 2022.08.24