[MySQL] 조회 쿼리 성능 개선 문의. 0 1 1,436

by 김쿠쿠 [SQL Query] [2022.05.16 13:59:03]


안녕하세요.

json 포맷의 로그들을 mysql의 text 필드에 저장하여 관리하고 있습니다.

해당 필드는 full text index가 지정되어 있는데요, 검색 되는 단어에 따라서 빠르게 조회가 되기도 하고,

혹은 조회가 되지 않고 타임아웃이 걸려 커넥션이 끊어지기도 합니다.

하여 어떻게 개선을 하면 좋을지 문의 드립니다.

CREATE TABLE log_data (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `log_id` varchar(45) NOT NULL,
  `log_type` varchar(45) NOT NULL,
  `logs` text,
  `reg_dt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `log_data_reg_dt_index` (`reg_dt`),
  FULLTEXT KEY `log_data_logs_fulltext_index` (`logs`)
);

 

SELECT 
	id,
    market_type,
    log_id,
	log_type,
    logs,
    reg_dt
FROM log_data
	reg_dt between '2022-01-01T00:00:00' and '2022-05-12T16:25:23'
 AND
	match(logs) against('2720101839')
;

처음엔 위에 등록된 쿼리 처럼 match against를 사용하였습니다. 큰 특이사항 없이 빠르게 조회가 되었습니다.

SELECT 
	id,
    market_type,
    log_id,
	log_type,
    logs,
    reg_dt
FROM log_data
	reg_dt between '2022-01-01T00:00:00' and '2022-05-12T16:25:23'
 AND
	match(logs) against('test.query.category')
;

그런데 위의 쿼리처럼 검색 조건에 숫자가 아닌 문자열 데이터가 들어가게 되는 경우

조회 속도가 급격히 느려 지게 되었습니다.

 

SELECT 
	id,
    market_type,
    log_id,
	log_type,
    logs,
    reg_dt
FROM log_data
	reg_dt between '2022-01-01T00:00:00' and '2022-05-12T16:25:23'
 AND
	logs like '%test.query.category%'
;

하여 위의 형태로 like 문으로 변경을 하였더니 다시 속도의 개선이 있었습니다만.

숫자형 데이터를 like문에 넣으니 느려서 조회가 되지 않았습니다.

 

결론적으로 보면,

숫자형 검색값의 경우 match against를 쓰면 빠르게 검색이 되었고,

문자열 검색값의 경우 like를 쓰면 빠르게 검색이 되었습니다.

서로 반대의 경우에는 굉장히 느려졌습니다.

 

하여 이러한 이유가 발생하는 이유가 궁금하기도 하고,

이런 경우에 어떤 형태로 쿼리를 조회하는 기능을 만들면 좋을지 조언을 구하고 싶습니다.

 

현재는 조건을 파싱하여, int형의 데이터인 경우 match agains 쿼리를,

그 외에는 like 문 쿼리를 구성하여 조회하는 방식을 생각 하고 있고,

혹시 1개의 쿼리로 둘다 가능하다면 1개의 쿼리로 구성을 하고 싶은 니즈도 있습니다.

 

아무쪼록 조언을 부탁 드리겠습니다.

by 신이만든지기 [2022.05.17 11:48:01]

인터넷 검색을 통해 추측한 내용이므로 참고만 해주세요.

참고사이트 : https://dev.mysql.com/doc/refman/5.7/en/fulltext-boolean.html

match against 구문 중 "against" 구문안에는 연산자( + - ( ) * < >  등)를 사용할 수 있다고 하네요.

혹시 검색하려는 키워드 중에 위 연산자가 들어간 것이 아닌지 궁금합니다. 연산자가 포함된 경우 검색되는 row가 많아져서 그런 걸 수도 있다는 생각이 듭니다. 

검색하려는 키워드가 문자열 그대로이라면 쌍따옴표( " ") 로 감싸서 검색해 보세요.

예 : against('"2720101839"') / against('"test.query.category"')

속도 개선이 될지 궁금하네요.

like 검색은 인덱스를 사용하지 못하므로, 데이터가 적을 땐 빠르게 나올 수 있으나 많아지면 느려질 것으로 예상됩니다.

like 검색시 키워드가 문자열인지 숫자인지에 따라 검색속도가 달라지는 이유는 실제 데이터가 어떻게 저장되어 있는지에 따라 달라지지 않을까 추측해 봅니다.

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입