2012-02-09 103 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 

的問題是,當我運行EXPLAIN SELECT ...搜索查找通過每個與表的每一行 - 這樣就會越大,而不是搜索只是行越慢此操作會,與parent_id = 0。

我想問一下:有沒有可能優化這種查詢呢?

+0

你能提供完整的表定義,並解釋輸出? – Wiseguy 2012-02-09 20:45:38

回答

0

添加一個索引到所有的ID列

alter table your_table add index(parent_id) 

與COMMENT_ID相同

+0

好,結果一樣。我一直在使用:CREATE INDEX測試ON評論(comment_id,parent_id); – 2012-02-09 20:25:10

+0

列的順序在索引中非常重要。我猜,comment_id是唯一的,所以INDEX測試ON評論(comment_id,parent_id)並沒有太多的作用。嘗試hforbess的建議CREATE INDEX test2 ON評論(parent_id),嘗試一個新的EXPLAIN,並看到現在使用索引。 – greyfairer 2012-02-09 22:14:25

+0

嗯,我試過只使用索引(parent_id)結果是一樣的。在2000個左右的行中搜索700個 - 他們必須過濾到175個。有趣的是,如果我通過c1.category ='cat1'進一步過濾它們,結果大約是700,但是如果過濾器是通過c2.category = 'cat1'mysql通過所有2000行。 – 2012-02-10 06:59:25