안녕하세요.. 아쉬울때만 문의를 남기네요 ㅡㅡ
130만건의 데이터를 갖고있는 테이블이 있습니다.
검색을 했을시 특정필드에 값이 존재하는지 체크를 하고있는데요. 속도가 느리네요.
특정필드 데이터 구성은 123,456,345 등으로 콤마를 구분자로 되어있는데요
단순히
SELECT * FROM order WHERE multibox_num LIKE '%$search%'
위 쿼리로 그냥 처리를 하니. 345라는 단어를 검색했을시 속도가 많이 느려지네요.
앞의 %가 없으면 인덱스를 탈수도 있겠지만 어쩔수없이 양쪽에 %를 넣어야하는 경우라서 좀 애매하네요.
고수님들의 조언좀 부탁드립니다.
감사합니다.
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