질문/조언질답게시판

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의 목록을 보여주고 싶습니다.

 

더 빠른 방법이 없을까요?

  • profile

    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

  • profile profile
    감사합니다.
    일부분만 검색해야하는 것이라 LIKE를 안할수가 없네요...ㅜㅜ
    적어주신대로 해보겠습니다~