안녕하세요 현재 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에는 인덱스가 걸려있습니다.
추가로 필요한 사항이 있으시다면 댓글 남겨주시면 바로 답글 달도록 하겠습니다!
감사합니다.
말씀하신대로 인덱스 사용은 어려워보이네요. 버전이 8.0이상이시면 정규식 함수를 사용해보시면 어떨지..
안녕하세요 답변 감사합니다. mySql 8.0을 사용하고 있습니다.
'REGEXP' 해당 명령어로 공백 제거를 검색해보고 있는데 아직 정확한 내용을 찾기가 힘드네요.
Replace와 비교했을 때 속도가 더 빠른 것인지 궁금합니다
사용자가 많지 않으면 말씀하신 방법을 이용해 사용할 수 있습니다.
추후 사용자가 늘어날 것을 대비하여 또는 현재도 사용자가 많아서 검색속도에 대한 성능이슈가 있어 성능 개선이 주목적이라면
"엘라스틱서치" 같은 검색엔진을 도입하시는 것이 근본적인 대책이 될 것으로 생각됩니다.
말씀하신 검색정확도에 대한 정렬순서 등이 쉽게 지원됩니다.
감사합니다. 검색엔진에 대해 좀 더 공부해보도록 하겠습니다!
정규식보다는 일반 문자함수가 더 가볍게 동작할 것으로 생각됩니다.
LIKE 보다는 INSTR 이 더 가볍지 않을까? 생각됩니다.
인덱스를 강제로 타도록 힌트를 이용하는 방법도 있습니다.
현재는 INSTR과 LIKE의 속도가 크게 차이가 없지만 INSTR을 사용해보도록 하겠습니다 감사합니다