index를 사용하지 못하는 경우
1.인덱스의 컬럼을 변형 시키는경우
인덱스 컬럼을 변형시키면 데이터베이스가 인덱스를 사용하지 않는다
SELECT * FROM users WHERE LOWER('first_name') = 'hong'
SELECT * FROM table WHERE ages+10 = 30 -> 인덱스 사용불가
SELECT * FROM table WHERE ages = 20 + 10 -> 인덱스 사용가능
2.null 조건을 사용하는 경우
null을 조건에 사용하면 Table Full Scan이 발생한다
SELECT * FROM users WHERE ages IS NULL -> 인덱스 사용불가
SELECT * FROM users WHERE ages IS NOT NULL -> 인덱스 사용불가
SELECT * FROM users WHERE ages > 0 -> 인덱스 사용가능
SELECT * FROM users WHERE ages > '' -> 인덱스 사용가능
3.부정형의 사용
NOT일 경우 무조건 인덱스를 사용하지 않는것이 아니라
일반적으로는 NOT에 사용된 값이 아닌 데이터 비율이 높은 경우가 많기 때문에 인덱스를 사용하지 않는다
SELECT * FROM users WHERE ages != 31 -> 인덱스 사용불가
SELECT * FROm users WHERE ages < 31 AND ages > 31 -> 인덱스 사용가능
4.LIKE문을 사용할때 전체범위를 설정하면 인덱스를 사용하지만
%가 앞에 붙을때는 Table Full Scan을 사용해서 인덱스를 사용하지 않는다
SELECT * FROM users WHERE first_name LIKE '%hong%' -> 인덱스 사용불가
SELECT * FROM users WHERE first_name LIKE 'hong%' -> 인덱스 사용가능
그래서 text index를 사용하여 성능을 향상 시킨다
검색기능을 text index로 사용해보자 (tistory.com)을 참고해보자
검색기능을 text index로 사용해보자
전통적인 검색 기능은 like 를 사용하여 검색을 이용했음허나 데이터가 많아지면 성능 저하가 생김like는 풀스캔을 하기때문에 이를 대체하고자 나온게 text index임 밑에는 mysql과 oracle에서 사용하
brilliant-growth.tistory.com
5.IN 연산자를 사용하는 경우
IN을 사용했을때 항상 인덱스를 사용하지 않는게 아니라 IN에 포함된 데이터들의 비율이 매우 높다면 Table Full Scan을 하는게 낫다고 데이터베이스가 판단하여 인덱스를 사용하지 않는다
SELECT * FROM users WHERE ages IN (20, 21, 22)
6.복합 인덱스에서 첫 인덱스가 첫 조건으로 적용되지 않았을 경우
복합 인덱스에서 인덱스의 순서가 name, age인 경우 name -> age의 순서로 조건을 걸어야 인덱스를 사용한다
SELECT * FROM users WHERE name = 'hong' AND age = 30 -> 인덱스 사용가능
SELECT * FROM users WHERE age = 30 AND name = 'hong' -> 인덱스 사용불가
7.인덱스 컬럼의 내부적인 데이터 변환
문자값 데이터 타입을 갖는 컬럼에 '값' -> 값 을 하지 말고 정확한 데이터 타입을 넣어야 인덱스를 사용한다
SELECT * FROM users WHERE age = '30' -> 인덱스 사용불가
SELECT * FROM users where age = to_number('30') -> 인덱스 사용가능