코드프레소 백엔드 개발자 양성 과정
LIKE 연산자
LIKE
연산자가 어떻게 작동하는지 알아보고, 사용 시 성능이 저하되지 않도록 하는 방법을 설명해본다.
LIKE 연산자
LIKE
연산자는 SQL 조회문에서 WHERE
절에 이용돼 한 열에서 특정 양식을 한 비슷한 결과들을 찾아낸다. 문법은 아래와 같다.
SELECT column_1, column_2, ...
FROM table_name
WHERE column_n LIKE pattern;
LIKE
문 뒤에 오는 패턴에는 다음과 같은 와일드카드를 사용할 수 있다.
- % : 백분율 기호는 글자가 없거나 하나 이상임을 뜻한다.
- _ : 밑줄은 한 글자를 뜻한다.
예를 들어, employees라는 테이블에 한 회사의 직원 정보가 담겨 있고 각 직원의 성은 last_name이라는 열에 기록되어 있다고 하자. 위의 와일드카드는 다음과 같이 사용된다.
이렇게 값을 정확히 알지 못해도 LIKE
연산자를 사용하면 원하는 정보를 조회할 수 있다.
주의할 점
하지만 LIKE
연산자를 모르고 사용하면 자칫 성능에 걸림돌이 될 수 있다. 바로 와일드카드가 인덱스 사용에 미치는 영향 때문이다. LIKE
연산자는 첫 번째 와일드카드가 등장하기 전까지의 문자열로만 스캔할 인덱스 범위를 결정하므로, 그 이후에 제공된 문자열은 겉보기와는 달리 인덱스를 간추리는 데 아무런 도움이 되지 않는다. 예시와 함께 보겠다.
다음과 같은 조회문을 실행했다고 하자.
SELECT first_name, last_name, date_of_birth
FROM employees
WHERE UPPER(last_name) LIKE 'WIN%D'
employees라는 테이블에서 성이 ‘WIN’으로 시작하고 ‘D’로 끝나는 직원을 조회한다. 이럴 경우, 와일드카드를 선행하는 ‘W’, ‘I’, ‘N’ 세 자만이 인덱스 범위를 좁히는데 사용되고 ‘D’는 나중에 적용되어 일치하는 결과를 찾아낼 때만 사용된다.
다음은 와일드카드 앞에 ‘WI’, ‘WIN’, ‘WINA’처럼 더 길고 상세한 문자열을 주는 것이 인덱스 범위에 얼마나 지대한 영향을 미치는지 보여주는 그림이다.
보다시피 모두 같은 결과인 ‘WINAND’를 찾았지만 와일드카드 앞에 ‘WI’만 제공했을 시 확연히 많은 인덱스를 조회해와야 했음을 볼 수 있다. 반면 ‘WINA’까지 입력해주면 한 번에 원하는 결과에 도달한다.
그러므로 LIKE
연산자를 사용할 때는 가장 이상적으로, 첫째, ‘%’나 ‘_’ 등의 와일드카드를 사용하지 않는 게 성능상 유리하다. 하지만 일반적으로 사용자가 검색어를 온전히 알지 못해 LIKE
연산자를 사용하는 경우가 대부분이므로, 둘째, 와일드카드를 사용하기 이전에 최대한 많은 문자를 제공해주도록 한다.