mysql 공백검색을 위한 방법 질문드립니다. 0 6 1,529

by Kun [MySQL] [2022.07.20 16:46:10]


안녕하세요 현재 mysql을 이용하여 서비스를 운영하려고 합니다. 

그런데 user의 경우 닉네임에 공백이 들어갈 수 있도록 하였는데 혹시 이런 경우에 가장 좋은 방법이 있을까요?? 

만약 닉네임이 'Ed Sheeran`일 경우 'ds'를 검색해도 검색이 되게 하려고 합니다. 

현재는

... where nickname like '%keyword%'

으로 사용 중인데 이렇게 하면 어차피 인덱스가 타지 않아 
 

... where REPLACE(nickname,' ','') like '%keyword%'

으로 변경하여 사용하려고 합니다. 

더 좋은 방법이 있을까 싶어 검색해보아도 거의 동일한 방법인것 같지만 혹시나해서 질문을 드립니다. 

full_textIndex를 사용하려 했으나 검색어가 길어질 경우 너무 느려지고, 1글자 검색이 가능은 하지만 인덱스 크기가 너무 커질것이 우려되어 like 검색어로 변경하게 되었습니다.

 

또한 추가로 'ed'라는 키워드로 검색 시 정확도 순으로 출력을 하고 싶습니다.

검색 시 'ed', 'ed sh', 'Ed Sheeran', 'asd ed' 과 같은 순서로 출력을 하고 싶은데

CASE WHEN name = 'ed' THEN 0 WHEN name like 'ed%' THEN 2 ...

와 같은 쿼리는 속도가 생각보다 나오지 않는데

조금 더 빠른 방법이 있을지 궁금합니다.

name에는 인덱스가 걸려있습니다.

 

추가로 필요한 사항이 있으시다면 댓글 남겨주시면 바로 답글 달도록 하겠습니다!

 

감사합니다.

by pajama [2022.07.20 16:59:07]

말씀하신대로 인덱스 사용은 어려워보이네요. 버전이 8.0이상이시면 정규식 함수를 사용해보시면 어떨지..


by Kun [2022.07.20 17:09:58]

안녕하세요 답변 감사합니다. mySql 8.0을 사용하고 있습니다.

'REGEXP' 해당 명령어로 공백 제거를 검색해보고 있는데 아직 정확한 내용을 찾기가 힘드네요.

 

Replace와 비교했을 때 속도가 더 빠른 것인지 궁금합니다


by 신이만든지기 [2022.07.20 17:57:27]

사용자가 많지 않으면 말씀하신 방법을 이용해 사용할 수 있습니다.

추후 사용자가 늘어날 것을 대비하여 또는 현재도 사용자가 많아서 검색속도에 대한 성능이슈가 있어 성능 개선이 주목적이라면

"엘라스틱서치" 같은 검색엔진을 도입하시는 것이 근본적인 대책이 될 것으로 생각됩니다.

말씀하신 검색정확도에 대한 정렬순서 등이 쉽게 지원됩니다.


by Kun [2022.07.20 18:09:19]

감사합니다. 검색엔진에 대해 좀 더 공부해보도록 하겠습니다!


by 마농 [2022.07.21 09:15:59]

정규식보다는 일반 문자함수가 더 가볍게 동작할 것으로 생각됩니다.
LIKE 보다는 INSTR 이 더 가볍지 않을까? 생각됩니다.
인덱스를 강제로 타도록 힌트를 이용하는 방법도 있습니다.


by Kun [2022.07.21 14:02:09]

현재는 INSTR과 LIKE의 속도가 크게 차이가 없지만 INSTR을 사용해보도록 하겠습니다 감사합니다

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