tbl_A는
no, id, name, date, del 필드를 가지고 있고
tbl_B는
no, id, memo, date, del 필드를 가지고 있습니다.
tbl_A와 tbl_B는 id라는 공통된 값으로 연결(?)됩니다.
목록은 tbl_A를 나열합니다.
문제는 tbl_B의 memo필드를 검색해야 한다는 것입니다.
일단 제가 만든 쿼리문은 아래와 같습니다.
SELECT * FROM tbl_A WHERE EXISTS ( SELECT * FROM tbl_B WHERE tbl_A.id = tbl_B.id AND tbl_B.memo LIKE '%검색어%') AND tbl_A.del = 'N' ORDER BY tbl_A.no DESC LIMIT 0, 20
문제는 검색은 되는데 너무 느리네요. ㅠㅠ
tbl_B의 memo필드에 원하는 검색어가 있는 tbl_A의 목록을 보여주고 싶습니다.
더 빠른 방법이 없을까요?
1. LIKE가 들어가면 당연히 느립니다. 기본적으로 감수해야 하는 부분입니다.
2. 양쪽 테이블의 id 컬럼, tbl_A의 no 컬럼과 del 컬럼에 모두 인덱스가 걸려 있나요? WHERE 또는 ORDER BY에 사용되는 컬럼들 중 LIKE로 검색하는 것 외에는 모두 인덱스가 있어야 합니다. (LIKE로 검색하는 memo 컬럼은 인덱스 걸어도 소용없고, 괜히 다른 쿼리만 느려질 수 있으므로 패스...)
3. JOIN으로 처리해 보세요.
SELECT tbl_A.* FROM tbl_A, tbl_B WHERE tbl_A.id = tbl_B.id AND tbl_B.memo LIKE '%검색어%' AND tbl_A.del = 'N' ORDER BY tbl_A.no DESC LIMIT 0, 20