쿠팡에는 키워드로 상품을 검색하는 기능이 있다
이 기능을 더 효율적인 쿼리로 구현하기 위해서는 어떻게 할 수 있을지 고민해보았다!
SELECT *
FROM coupang.PRODUCT
WHERE name LIKE '%키워드%';
type
: ALLrows
: 49488572LIKE
에서 물티슈%
와 같이, 와일드카드를 뒤쪽에 붙였을 때에는 인덱스를 잘 활용한다.%물티슈
, %물티슈%
와 같이%
와일드카드를 앞에 붙이면 인덱스를 활용하지 못하고, full scan 하여 성능이 매우 떨어지는 것이다.%물티슈
처럼 앞에만 와일드카드를 붙이는 경우에는 인덱스를 탈 수 있다고 한다.ALTER TABLE `coupang`.`PRODUCT`
ADD FULLTEXT INDEX `name` (`name`)
WITH PARSER NGRAM VISIBLE;
-- QUERY 1
SELECT *
FROM coupang.PRODUCT
WHERE MATCH (`name`) AGAINST ('2312341' IN NATURAL LANGUAGE MODE);
-- QUERY 2
SELECT *
FROM coupang.PRODUCT
WHERE MATCH (`name`) AGAINST ('2312341' IN BOOLEAN MODE);
BOOLEAN
으로 바꾸었다.[ERROR] FTS query exceeds result cache limit mysql
- 캐시 한도를 두 배로 올렸지만, 계속 같은 오류가 발생하였음
SET GLOBAL innodb_ft_result_cache_limit = 4000000000;