[Real MySQL] 08. SELECT를 위한 완벽한 인덱스 활용해보기 part 1

김학성·2023년 6월 9일
0

Real MySQL

목록 보기
6/6
post-thumbnail

본 포스팅은 Rick James의 MySQL: Building the best INDEX for a given SELECT와 Real MySQL을 참고했습니다. 틀린 부분이 있다면 지적 부탁드립니다!

데이터베이스의 인덱스를 활용하여 검색 속도를 빠르게 수행할 수 있다는 건 서비스 성능의 중요한 부분이라고 해도 과언이 아닌데요.

데이터를 검색하는 성능을 끌어올리기 위해 어떻게 SELECT문을 작성해야 인덱스를 제대로 사용할 수 있을지 알아보도록 하겠습니다.

인덱스를 활용하기 위한 단계

인덱스를 제대로 활용하기 위해 아래 단계들을 바탕으로 SQL문을 전략적으로 작성하며 실습해보도록 하겠습니다.

상수와 일치하는 조건문

학교에서 학생에 대한 테이블이 있는데 학생의 이름인 name에 대해 인덱스를 생성하였다고 가정해보겠습니다.

name컬럼으로 인덱스가 생성되었기 때문에 아래와 같이 조건문을 작성하여 빠르게 해당 레코드를 조회할 수 있습니다.

WHERE name = "김규식";

흔한 예시이지만 책에서 원하는 내용을 빠르게 찾을 수 있는 찾아보기 페이지(색인 페이지)를 보는 것과 같습니다.

만약 아래와 같이 인덱스 컬럼에 함수를 적용한 경우에는 인덱스를 사용할 수 없으니 주의해야합니다. 인덱스 페이지에 찾고자 하는 값이 함수로 인하여 변형될 수 있기 때문입니다.

WHERE LOWER(code) = "..." | WHERE DATE(date) = "..."

앞에서 일치하는 조건문

만약 학생 이름에서 김씨로 해당하는 학생들을 찾고 싶다면 별문제가 되지 않고 빠르게 조회할 수 있습니다.

WHERE name LIKE "김%";

이미 name컬럼의 인덱스는 값들이 정렬이 되어있기 때문에 김씨로 시작하든 박씨로 시작하든 빠르게 찾을 수 있기 때문입니다.

그런데 만약 '진'으로 끝나는 이름을 가진 학생들을 찾고 싶다고 합니다.

WHERE name LIKE "%진";

인덱스는 정렬된 데이터이지만 뒤에서 일치하는 조건문에 대해서는 그 위치를 찾을 수 없기 때문에 결국 전체 테이블을 조회하게 되는데요.
그래서 일부분에 대해서 일치하는 레코드를 찾고싶다면 앞에서 일치하는 조건문을 활용해야 합니다.

IS NULL

MySQL에서는 다른 DBMS와 다르게 NULL값도 저장하기 때문에 아래와 같은 조건문은 상수와 일치하는 조건문과 동일하게 동작합니다.

WHERE column IS NULL

IS NOT NULL의 경우 인덱스를 경유하지 못하지만 컬럼의 최솟값을 정해주고 범위를 결정하여 조건문을 작성하는 것이 효율적일 수 있습니다.

WHERE grade IS NOT NULL (x) | WHERE grade > 0 (o);

참고 : https://mysql.rjweb.org/doc.php/index_cookbook_mysql#first_some_examples
http://wiki.gurubee.net/pages/viewpage.action?pageId=27427980
Real MySQL 08장_인덱스

profile
경험과 성장을 기록하는 개발자입니다

0개의 댓글

Powered by GraphCDN, the GraphQL CDN