2012-02-09 9 views
2

こんにちは私は全文検索を実行するコメントテーブルを持っています。 c1とc2は同じテーブルのエイリアスで、 の条件で使用されます:c1.parent_id = 0質問のみが表示されます(回答は添付されていません) とvia c2.parent_id <>この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

と同じ

alter table your_table add index(parent_id) 

にインデックスを追加しますか? – Wiseguy

答えて

0

は、あなたが完全なテーブル定義を提供し、出力を説明することができ、すべてのid列comment_id

+0

まあ、同じ結果です。私は使用しています:CREATE INDEXテストのコメント(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行を通過します。 –