[SQL] 효율적인 SQL 쿼리 튜닝 방법 (WHERE 조건, GROUP BY, 인덱스 생성)

EUN JY·2022년 2월 12일
2

Database

목록 보기
1/21
post-thumbnail

1. SQL 쿼리 작성 시

1-1. WHERE 조건

  • 인덱스 컬럼을 WHERE 절에 모두 사용하도록 함
    • 인덱스 컬럼이 3개인데, WHERE 절에서 하나라도 사용하지 않으면 FULL SCAN을 하게 됨
  • OR 연산자 보다 AND 연산자 사용
    • OR 연산자보다 UNION ALL을 쓰는 것이 더 효과적
/* OR 사용 */
SELECT *
FROM USER
WHERE USER_ID =sqlOR USER_ID = ‘query’;
/* UNION ALL 사용 */
SELECT *
FROM USER
WHERE USER_ID =sqlUNION ALL
SELECT *
FROM USER
WHERE USER_ID = ‘query’;
  • LIKE, NOT IN, IS NOT NULL, NOT NULL 보다 등호(=) 사용이 효율적
    • IN, NOT IN 보다 EXISTS, NOT EXISTS 사용이 효율적
SELECT * 
FROM USER
WHERE USER_ID LIKE ‘abc%;
  • 컬럼을 변형하여 사용하는 것을 지양
    • 해당 컬럼에 대해 기존에 생성된 인덱스를 사용할 수 없게 됨
SELECT * 
FROM USER
WHERE SUBSTR(USER_ID, 1, 3) = ‘abc’;
  • ‘USER_ID’가 UNIQUE 인덱스일 경우, LIKE를 사용하면 INDEX ROWID SCAN을 하지만 컬럼을 변형하면 FULL SCAN을 하게 됨

1-2. GROUP BY

  • GROUP BY 사용 시, HAVING 보다는 WHERE 절을 사용
  • WHERE 절 실행 후 HAVING 조건이 필터링 됨
  • DISTINCT 사용 지양

2. 인덱스 설정

2-1. B-TREE 인덱스

  • UNIQUE, Non UNIQUE, Function Based, Descending, Compisite(결합)
  • 결합 인덱스 : 인덱스 생성 시 두 개 이상의 컬럼을 합쳐서 인덱스를 만드는 것
  • UNIQUE 인덱스 : 중복된 값을 허용하지 않도록 설정하는 인덱스
    • 해당 컬럼에 이미 중복된 값이 존재하면 생성 불가
    • 여러 컬럼을 조합하여 생성할 경우, 모든 컬럼의 조합이 중복되지 않으면 생성 가능
/* UNIQUE 인덱스 생성 */
CREATE UNIQUE INDEX index_name ON table_name (column_name1, column_name2,);
/* 인덱스 삭제 */
DROP INDEX index_name;
/* 인덱스 확인 */
SHOW INDEX FROM table_name;

2-2. BITMAP 인덱스

  • 데이터 값의 종류가 많고 동일 데이터가 적을 때 사용
  • 인덱스 컬럼 개수만큼 맵이 만들어지는데, 데이터 추가 시 맵을 전부 수정해야 함
  • 데이터 변경이 안되는 테이블, 값의 종류가 적은 컬럼에 생성

2-3. Hash 인덱스

  • 컬럼 값으로 해시 값을 계산하여 인덱싱
  • 시간복잡도 O(1) 으로 빠른 검색 지원
  • 값을 변형하여 인덱싱하므로, 값의 일부를 가지고 검색하는 경우 비효율적
  • 등호(=) 연산에 특화되어 있으나 부등호(<>)연산 시 문제가 발생하므로 B-TREE 사용 권장
profile
개린이

0개의 댓글