【问题标题】:Could this MYSQL be optimized?这个MYSQL可以优化吗?
【发布时间】:2012-02-09 20:12:11
【问题描述】:

您好,我有一个 cmets 表,我在该表上运行全文搜索。 c1 和 c2 是使用的同一个表上的别名 通过标准:c1.parent_id=0 我只得到问题(不是附在他们身上的答案) 并通过 c2.parent_id0 我过滤已经有答案的问题

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 的行.

我想问一下:这种查询是否可以进一步优化?

【问题讨论】:

  • 能否提供完整的表定义和 EXPLAIN 输出?

标签: mysql optimization indexing full-text-search


【解决方案1】:

为所有 id 列添加索引

    alter table your_table add index(parent_id)

与comment_id相同

【讨论】:

  • 好吧,同样的结果。我一直在使用:CREATE INDEX test ON cmets (comment_id,parent_id);
  • 列的顺序在索引中非常重要。我猜,comment_id 是独一无二的,所以对 cme​​ts (comment_id,parent_id) 的 INDEX 测试并没有真正做太多。试试 hforbess 的建议 CREATE INDEX test2 ON cmets (parent_id),试试新的 EXPLAIN 看看现在索引用上了。
  • 好吧,我试过只使用 index on(parent_id) 结果是一样的。在 2000 行中,大约 700 条被搜索——它们必须被过滤到 175 条。有趣的是,如果我通过 c1.category = 'cat1' 进一步过滤它们,结果大约是 700,但如果过滤器是通过 c2.category = 'cat1' mysql 遍历所有 2000 行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多