Table 내에 특정 컬럼에 INDEX를 설정하여 LIKE 문을 통해 검색하는 경우
INDEX를 생성한다 하더라도 %의 위치에 따라 INDEX가 정상 작동을 하지 않아 Table SCAN(Full SCAN) 이 발생하는 경우도 있습니다
이번 글에서는 LIKE 검색시 % 위치에 따라 INDEX 사용 여부를 확인해보겠습니다
Table 구조
INDEX 컬럼
100만개의 데이터에 대해 INDEX 생성시 16.14 초가 걸렸습니다
INDEX를 생성하게 되면 해당 INDEX는 (한글 기준) 내의 데이터들이 ㄱ, ㄴ, ㄷ 순으로 정렬되어 추후 해당 column을 탐색시 사용되게 됩니다
id
select_type
table
type
possible_keys
key
key_len
ref
rows
extra
1. '광명읍구로동%' 과 같이 데이터 시작 형식을 검색하는 경우
subject like '광명읍%' 검색인 경우 광명읍으로 시작하는 데이터들을 조회하고자 하는 것입니다.
2. '%광명읍구로동' 끝나는 데이터 형식을 검색하는 경우
subject like '%광명읍' 검색인 경우 광명읍으로 끝나는 데이터들을 조회하고자 하는 것입니다.
3. '%광명읍구로동% 데이터에 포함하는지 검색하는 경우
subject like '%광명읍' 검색인 경우 광명읍이 포함된 데이터들을 조회하고자 것입니다.
데이터베이스의 인덱스의 자료구조는 대부분 B Tree 구조로 이루어져있습니다.
이는 한글 기준 ㄱ,ㄴ,ㄷ 순으로 정렬이 되어있으므로 왜? % 위치에 따라 인덱스 조건이 적용되지 않았을까?
를 다시 생각해보면 인덱스가 사용될때
광명읍%
광명읍으로 시작하는 자료를 찾아주고
%광명읍
광명읍으로 끝나는 자료를 찾아주며
%광명읍%
광명읍을 포함하는 자료를 모두 찾아줍니다
이러한 특징을 생각해보면 인덱스를 사용하기 위해서는 INDEX의 이 정렬된 특징을 사용해야 합니다
데이터를 찾을때 광명읍%
의 경우 데이터 가장 앞단에 "광명읍" 이라는 키워드를 기준으로 데이터들을 탐색할 수 있습니다 이때 filtered
가 100으로 INDEX가 100% 적용된 것을 확인할 수 있습니다
반면 %광명읍, %광명읍%
의 경우 가장 앞단을 기준으로 "광명읍" 키워드를 탐색하는 것이 아닌 포함되어있는지를 판단하는 것이기 때문에 filtered
가 11.11 으로 INDEX 11.11%만 적용된 것을 볼 수 있습니다
Full Text Search
을 사용하면 인덱스를 사용하지 못한 부분을 사용하면 빠른 검색이 가능하다고 합니다.
Full Text Search에 대해서는 추후에 업로드할 예정입니다
참고