like문을 대체할수있는방법? 0 2 631

by 날아라! [MySQL] [2018.08.29 16:08:48]


안녕하세요.. 아쉬울때만 문의를 남기네요 ㅡㅡ

130만건의 데이터를 갖고있는 테이블이 있습니다.

검색을 했을시 특정필드에 값이 존재하는지 체크를 하고있는데요. 속도가 느리네요.

특정필드 데이터 구성은 123,456,345 등으로 콤마를 구분자로 되어있는데요

단순히

SELECT * FROM order WHERE multibox_num LIKE '%$search%'

위 쿼리로 그냥 처리를 하니. 345라는 단어를 검색했을시 속도가 많이 느려지네요.

앞의 %가 없으면 인덱스를 탈수도 있겠지만 어쩔수없이 양쪽에 %를 넣어야하는 경우라서 좀 애매하네요.

고수님들의 조언좀 부탁드립니다.

 

감사합니다. 

by 마농 [2018.08.29 16:27:30]

LIKE 대신 INSTR 을 사용할 수 있습니다.
INSTR 이 LIKE 보다는 함수가 좀 더 가볍다고 합니다.
(어디선가 주워 들었는데 확신할 수 없음)
함수의 가벼움으로 해결될 수 있는 문제는 아닙니다.
구조 변경 없이 해결이 불가능한 문제입니다.
1. 구조 변경
 - 테이블 분리, 정규화
2. 추가적인 도구 사용 방법
 - 병렬쿼리수행
 - full text searching
 - 검색엔진 도입
기타 문제점
 - '345' 를 검색했을 때 '123,456,345' 만 검색되는게 아닙니다.
 - '23456' 도 함께 검색 될 수 있습니다.
 - 가변자리수 자료라면? 원치 않는 자료가 검색될 가능성이 있습니다.
 - 다음과 같이 바꿔야 합니다.
 - WHERE CONCAT(',', multibox_num, ',') LIKE '%,$search,%'
 - WHERE INSTR(CONCAT(',', multibox_num, ','), ',$search,') > 0


by 우리집아찌 [2018.08.29 16:47:55]

MYSQL 이라면 FULL TEXT INDEX 검색해보세요.

http://interconnection.tistory.com/95

 

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