반응형
인덱스를 타지 않는 쿼리
1. function or operation query
SELECT * FROM employee WHERE UPPER(name) = 'AHN';
SELECT * FROM employee WHERE YEAR(worked_at) = 2023;
SELECT * FROM employee WHERE age + 1 = 100;
인덱스 컬럼에 함수 또는 연산을 수행하는 경우 데이터베이스는 인덱스를 사용하지 못합니다.
이유:
- 인덱스는 Key의 순서대로 정렬되어 있습니다.
- 이를 함수나 연산을 통해 인덱스에 변환을 수행하면, 기존 인덱스와의 순서가 불일치하는 문제가 생겨 인덱스를 통해 탐색을 하지 못합니다.
2. Like문 검색에서 와일드카드의 위치
SELECT * FROM employee WHERE name LIKE 'A%'; -- 인덱스 활용O
SELECT * FROM employee WHERE name LIKE '%A'; -- 인덱스 활용X
SELECT * FROM employee WHERE name LIKE '%A%'; -- 인덱스 활용X
LIKE 절에서 문자열이 제일 앞에 있고 "%" 가 뒤에 있는 경우, 인덱스를 활용할 수 있지만,
"%"가 앞이나 중간에 있을 경우에는 인덱스를 활용할 수 없습니다.
이유:
- %가 앞에 있지 않는 경우, 정렬 순서가 바뀌어 인덱스를 사용하지 못 합니다.
3. OR 절을 사용하는 경우
SELECT * FROM employee WHERE name = 'Ahn' OR age = 26; -- 인덱스 활용X
OR 절은 여러 개의 조건 중 하나라도 참이면 전체 조건을 참으로 판단합니다.
즉, OR 절이 사용된 쿼리는 데이터베이스가 조건의 모든 경우를 검사하고 해당 결과를 결합해야 하므로, 옵티마이저가 최적의 조건으로 인덱스 대신 FULL SCAN을 하는 경우가 많습니다.
→ 상황에 따라서 OR 절 대신 UNION, UNION ALL 방법을 사용하여 여러 개의 쿼리를 실행하고 결과를 조합하여 최적화를 해야 합니다.
4. NULL 값을 사용하는 경우
SELECT * FROM employee WHERE name = NULL; -- 인덱스 활용X
SELECT * FROM employee WHERE age IS NULL; -- 인덱스 활용X
SELECT * FROM employee WHERE age > 0; -- 인덱스 활용O
NULL 값을 사용하면 인덱스를 사용할 수 없습니다.
IS NULL
- 대부분의 데이터베이스에서 B-Tree와 같은 기본 인덱스는 NULL 값을 포함하지 않는다.
- 인덱스가 NULL 값을 건너뛰기 때문에 IS NULL 조건이 인덱스를 활용하지 못합니다.
5. IN 목록의 개수가 많은 경우
SELECT *
FROM employee
WHERE id IN (1, 2, 3, ..., 1000);
IN 연산자를 사용한 검색에서 IN 목록의 개수가 많은 경우, Index 스캔 대신 FULL SCAN이 발생할 수 있다.
→ IN 연산은 “=”로 수행하여 Index 탐색을 하지만, 조회해야 하는 목록이 많아지면 바뀔 수 있습니다.
반응형
'CS > Database' 카테고리의 다른 글
[Mysql] Mysql 쿼리 최적화, 성능 최적화 - 기본편 (0) | 2024.09.21 |
---|---|
[Database] 데이터베이스 index, clustered index, non-clustered index 이해하기 (0) | 2024.09.18 |
[DB] 데이터베이스 인덱스 Index 이해하기 - 희소 인덱스, 밀집 인덱스, 클러스터링 인덱스 (0) | 2024.02.28 |
[Mysql] mysql select 쿼리 실행 순 익히기, 스키마 create&drop (0) | 2023.10.21 |
[DB] 데이터베이스의 원칙과 ACID, RDBMS와 NOSQL의 차이점 이해하기 (0) | 2023.10.09 |