2012-02-09 3 views
2

안녕하세요. 전체 텍스트 검색을 실행할 주석 테이블이 있습니다. c1 및 c2는 기준을 사용하여 동일한 테이블에있는 별칭입니다. c1.parent_id = 0 질문 만 받음 ​​(첨부 된 답변이 아님) 및 c2.parent_id를 통해 <> 0 나는 이미 답변 된 질문을 필터링합니다. 그래서 더 큰이가 대신 행을 검색하는, 느린이 작업이 될 것 얻는다 -이 MYSQL을 최적화 할 수 있습니까?

SELECT DISTINCT c1.comment, c1.comment_id, MATCH(c1.comment) AGAINST ('keyword1 keyword2 keyword3') AS score 
    FROM comments AS c1 
     JOIN comments AS c2 
      ON c1.comment_id = c2.parent_id 
    WHERE c1.parent_id=0 
     and c2.parent_id <> 0 
    ORDER BY score DESC LIMIT 9 

문제는 내가 SELECT를 EXPLAIN 실행할 때 ... 검색이 각 통해 조회 테이블의 모든 행이다 parent_id = 0 인

나는 이런 질문을 더 이상 최적화 할 수 있습니까?

+0

당신이 전체 테이블 정의를 제공하고 출력을 설명 할 수 comment_id와 같은 모든 ID 열

alter table your_table add index(parent_id) 

에 인덱스를 추가? – Wiseguy

답변

0

+0

음, 같은 결과. 나는 사용하고있다 : CREATE INDEX test on comments (comment_id, parent_id); –

+0

색인의 열 순서는 매우 중요합니다. comment_id는 고유 한 것 같습니다. 따라서 INDEX 테스트에 대한 주석 (comment_id, parent_id)은 실제로 그렇게하지 않습니다. hforbess의 제안을 시도해보십시오. CREATE INDEX test2 주석 (parent_id)에 새로운 EXPLAIN을 시도하고 색인이 지금 사용되는지 확인하십시오. – greyfairer

+0

글쎄, 나는 (parent_id)에 인덱스를 사용하여 시도한 결과가 동일합니다. 2000 개 행 중 700 개가 검색되어 175 개까지 필터링되어야합니다. 흥미로운 점은 c1.category = 'cat1'을 통해 필터를 추가하면 결과가 약 700이지만 필터가 c2.category = 'cat1'mysql은 모든 2000 행을 통과한다. –

관련 문제