[TIL 2021.09.30] Real MySQL: 실행계획 type 컬럼 fulltext

Kyu·2021년 9월 30일
0

TIL

목록 보기
263/322
post-thumbnail

Today I Learned
실행계획 type 컬럼 - fulltext

system			|
const			|
eq_ref			|
ref			|
fulltext		|
ref_or_null		|
unique_subquery		|
index_subquery		|
range			|
index_merge		|
index			|
ALL			|

fulltext

fulltext 인덱스를 사용해 레코드를 읽는 접근 방식을 의미.
MySQL은 fulltext 인덱스가 있으면 쿼리의 비용과 관계없이 거의 매번 fulltext 접근방법을 사용한다.
const, eq_ref, ref를 선택할수있는 쿼리에서 억지로 fulltext를 선택하는 것은 아니다.
fulltext는 풀스캔하는 LIKE보다 훨씬 빠르다.

  • like -> match against 로 쿼리 변경시 성능 개선
  • 뉴스 제목 200만건 중 50건 정도되는 검색시
    21.606sec => 1.154 sec
  • 2000만건 대상, 비약적 차이 (몇 분이 걸려 검색 불가 => 5초 내에 가능)

출처: https://dogcowking.tistory.com/78

MySQL에서 fulltext를 이용하기 위해선 MATCH (컬럼) AGAINST (검색어)구문을 이용해야한다.

explain
select *
from employee_name
where emp_no = 10001
and emp_no between 10001 and 10005
and MATCH(first_name, last_name) AGAINST('Facello' IN BOOLEAN MODE);

explain
select *
from employee_name
where emp_no between 10001 and 10005
and match(first_name, last_name) against('Facello' in boolean mode);

둘다 같은 1건의 레코드를 내보내는 쿼리다.
첫번째 쿼리는 세개의 조건 중에서 PK를 1건만 조회하는 const 타입을 선택했다.
두번째쿼리는 첫번째 조건을 제거한 쿼리이다.
emp_no이 10001 과 10005 사이의 조건과 fulltext 를 사용하여 Fecello라는 이름을 찾고 있다.
between이 있어서 range를 사용할수도 있을거같지만,
결과는 fulltext로 찾는다.

MySQL은 MATCH AGAINST 를 사용하면 fulltext 접근 방식을 많이 사용한다.
하지만 책의 저자의 경험상 range접근법이 더빨리처리되는 경우가 많다고한다.
전문검색쿼리사용시 조건별 성능을 확인해보는 게 좋다.

profile
TIL 남기는 공간입니다

0개의 댓글