- [MySQL] LIKE 문의 동작 방식과 Index와의 관계2025년 04월 21일 18시 29분 47초에 업로드 된 글입니다.작성자: do_hyuk728x90반응형
post 라는 테이블의 title이라는 컬럼에 Index가 걸려있다고 가정한다.
SELECT * FROM post WHERE title LIKE 'test%'; SELECT * FROM post WHERE title LIKE '%test'; SELECT * FROM post WHERE title LIKE '%test%';
LIKE 문은 특정 문자열의 포함 여부를 체크하는 기준에 따라서 3가지 형태로 구분할 수 있다.
여기서 중요한 점은 데이터의 앞부분에 문자열이 포함되는지 체크하는 경우에만 Index를 타게 된다는 점이다.
즉, 첫 번째 쿼리는 title에 대한 Index가 데이터 조회에 사용되지만, 나머지 쿼리들은 테이블 풀스캔을 하게되는 것이다.
왜 이렇게 동작하는 것일까?
LIKE와 INDEX
위에서 이야기한 것에 대해서 이해하려면, Index의 자료구조에 대해서 알아야 한다.
Index는 B-Tree 또는 B+Tree 자료구조로 관리가 되는데, B 트리는 기본적으로 데이터를 1,2,3 또는 ㄱ,ㄴ,ㄷ과 같은 오름차순 형태로 들고 있기 때문에 특정 문자열로 시작하는 데이터의 주소값을 알 수 있지만 그렇지 않은 경우엔 모든 테이블을 다 뒤져야만 조건에 만족하는 데이터를 찾을 수 있다.
SELECT * FROM post WHERE title LIKE 'test%';
예를 들어서 위와 같은 쿼리를 실행했다고 가정하고, MySQL 서버 안에서는 어떤 일이 벌어질지 생각해보자.
먼저 test 로 시작하는 데이터를 찾을 것이고, 그 이후에 데이터들 중에서 test 로 시작하지 않는 데이터를 찾게 될 것이다.
그러면, 그 사이의 데이터들은 모두 test 로 시작하는 데이터라는 것을 알 수 있는 것이다.
왜냐하면, 오름차순으로 데이터가 정렬되어 있기 때문이다.
우리가 사전에서 원하는 글자를 찾거나 도서관에서 원하는 도서를 찾는 과정과 흡사하다.
반면에, 특정 문자열이 test 로 끝나거나, 중간 어딘가에 test 가 포함되어 있는 데이터를 찾으려면 모든 데이터를 뒤져야하는 방법 밖에 없다. 마찬가지로 데이터가 오름차순으로 정렬되어 있기 때문이다.
728x90반응형'백엔드' 카테고리의 다른 글
Elasticsearch란? (0) 2025.04.24 Full-Text Search 사용법 (0) 2025.04.22 성능테스트를 위한 K6 사용법 (0) 2025.02.24 [로드맵] CI/CD (0) 2025.01.02 [로드맵] 기능 테스트 (1) 2024.12.31 댓글