반응형

들어가며

MATCH AGAINST란?

  • MySQL에서 텍스트 검색시 LIKE '%text%' 조건으로 검색할 수 있지만 성능이 좋지 않다.
  • MATCH AGAINST 키워드를 사용하면 비교적 빠른 검색이 가능하다.
  • MATCH AGAINST 키워드를 사용하려면 테이블에 FULLTEXT INDEX가 추가되어있어야 한다.
  • MyISAM 엔진에서는 기본 지원, InnoDB에서는 5.6 버전 이상부터 지원한다.

주요 쿼리

테이블 생성시 FULLTEXT 인덱스 생성

CREATE TABLE board (
    ...,
    FULLTEXT KEY idx_contents (contents)
);

이미 생성되어 있는 테이블에 FULLTEXT 인덱스 추가

ALTER TABLE board ADD FULLTEXT INDEX idx_contents (contents);

조회

  • "검색어1" OR "검색어2"가 포함된 데이터를 조회
    SELECT * FROM board
    WHERE MATCH(contents) AGAINST('검색어1 검색어2' IN BOOLEAN MODE);
    
  • "검색어1" AND "검색어2"가 모두 포함된 데이터를 조회
    SELECT * FROM board
    WHERE MATCH(contents) AGAINST('검색어1 +검색어2' IN BOOLEAN MODE);
    
  • "검색어1"이 포함된 데이터 중에 "검색어2"가 들어간 것 제외하여 조회
    SELECT * FROM board
    WHERE MATCH(contents) AGAINST('검색어1 -검색어2' IN BOOLEAN MODE);
    
  • "검색어%"가 포함된 데이터를 조회 ("%검색어" 조회는 안되는듯?)
    SELECT * FROM board
    WHERE MATCH(contents) AGAINST('검색어*' IN BOOLEAN MODE);
    
  • "검색어1 검색어2"가 포함된 데이터를 조회
    SELECT * FROM board
    WHERE MATCH(contents) AGAINST('"검색어1 검색어2"' IN BOOLEAN MODE);
    

테스트

테스트 테이블 생성

-- LIKE 검색용 테이블
CREATE TABLE UserV1
(
    userSeq INTEGER UNSIGNED AUTO_INCREMENT,
    name    VARCHAR(100),
    PRIMARY KEY (userSeq)
);

-- MATCH AGAINST 검색용 테이블
CREATE TABLE UserV2
(
    userSeq INTEGER UNSIGNED AUTO_INCREMENT,
    name    VARCHAR(100),
    PRIMARY KEY (userSeq),
    FULLTEXT KEY (name)
);

테스트 데이터 추가

  • 편의상 자바 코드로 데이터 추가
IntStream
    .range(0, 100000)
    .forEach(value -> {
        String name = UUID.randomUUID().toString();

        jdbcTemplate.update("INSERT INTO UserV1 (name) VALUES (?)", name);
        jdbcTemplate.update("INSERT INTO UserV2 (name) VALUES (?)", name);
    });

조회 - LIKE

mysql> select count(*) from UserV1 where name like '%bcc9%';
+----------+
| count(*) |
+----------+
|       27 |
+----------+
1 row in set (0.04 sec)

조회 - MATCH AGAINST

mysql> select count(*) from UserV2 where match(name) against('bcc9');
+----------+
| count(*) |
+----------+
|       11 |
+----------+
1 row in set (0.00 sec)

결론

  • LIKE 검색과 MATCH AGAINST 검색은 조회 결과가 다를 수 있다.
  • 조회시 LIKE 검색은 0.04s, MATCH AGAINST는 0.00s로 MATCH AGAINST가 비교적 빠르다.

참고

반응형

'Development > MySQL' 카테고리의 다른 글

[MySQL] ProxySQL  (0) 2021.11.16
[MySQL] Replication  (0) 2021.11.15
[MySQL] SQL_CACHE  (0) 2021.10.30
[MySQL] Lock  (0) 2021.02.26
[MySQL] JOIN  (0) 2021.02.25

+ Recent posts