1. SQL 쿼리 작성 시
1-1. WHERE 조건
- 인덱스 컬럼을 WHERE 절에 모두 사용하도록 함
- 인덱스 컬럼이 3개인데, WHERE 절에서 하나라도 사용하지 않으면 FULL SCAN을 하게 됨
- OR 연산자 보다 AND 연산자 사용
- OR 연산자보다 UNION ALL을 쓰는 것이 더 효과적
SELECT *
FROM USER
WHERE USER_ID = ‘sql’
OR USER_ID = ‘query’;
SELECT *
FROM USER
WHERE USER_ID = ‘sql’
UNION 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 인덱스 : 중복된 값을 허용하지 않도록 설정하는 인덱스
- 해당 컬럼에 이미 중복된 값이 존재하면 생성 불가
- 여러 컬럼을 조합하여 생성할 경우, 모든 컬럼의 조합이 중복되지 않으면 생성 가능
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 사용 권장