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