2013-04-16 60 views
0

我一直在使用下面的查询一段时间,但随着结果数据库的增长,它已变得很慢,以至于无法使用。任何人都可以提出一个替代方法吗?为什么会在哪里运行非常缓慢

我已经有了c.name全文索引和r.scope

SELECT * FROM results r 
     INNER JOIN categories c on r.id = c.result_id 
     INNER JOIN tags t on r.id = t.result_id 
     WHERE c.name in ('purchase', 'single_family', 'other') 

     AND (r.scope = 'all' OR r.scope = 'hi') 
     AND published = 1 
    GROUP BY r.id 
     HAVING COUNT(c.c_id) >= 3 
     ORDER BY r.usefulness DESC 
     LIMIT 8 OFFSET 0 

任何帮助将非常感激。谢谢!

编辑:下面是EXPLAIN

id select_type  table type possible_keys key  key_len  ref  rows Extra 
1 SIMPLE c range nameindex,name nameindex 767  NULL 10036 Using where; Using temporary; Using filesort 
1 SIMPLE t ALL  NULL NULL NULL NULL 10229 Using where; Using join buffer 
1 SIMPLE r eq_ref PRIMARY,scope PRIMARY  4 rfw.t.result_id  1 Using where 
+0

建议您在字段'c上使用索引。名称'使其更快。 – fedorqui

+3

'EXPLAIN'说什么? – Vyktor

+0

你有索引category.name? –

回答

1

更新:查询创建索引

CREATE INDEX名称ON类别(名称);


使用EXPLAIN语句,说明将帮助你决定哪些列需要索引&其他有用的信息的输出。

mysql doc规定:

当你先用关键字SELECT语句EXPLAIN,MySQL的 显示约查询执行计划 优化信息。也就是说,MySQL解释了它将如何处理声明 ,其中包括有关表的连接方式和顺序的信息。

运行以下命令:

EXPLAIN SELECT * FROM results r 
    INNER JOIN categories c on r.id = c.result_id 
    INNER JOIN tags t on r.id = t.result_id 
    WHERE c.name in ('purchase', 'single_family', 'other') 

    AND (r.scope = 'all' OR r.scope = 'hi') 
    AND published = 1 
GROUP BY r.id 
    HAVING COUNT(c.c_id) >= 3 
    ORDER BY r.usefulness DESC 
    LIMIT 8 OFFSET 0 
+0

谢谢,请参阅我上面的编辑:) –

+0

你可以在类别表中的名称列创建索引,并再次运行解释和查询。我已添加将创建索引的示例查询。 –

+0

再次编辑,真的很感谢帮助:D –

-1

1)选择只需要在你的答案列的结果。 2)设置房产表索引。 您也可以使用EXPLAIN SELECT ...

+0

-1你基本上对他说,他应该自己调试它使用解释 – Vyktor

0

您不需要fulltext索引;一个普通的索引是mySQL想要用于这个领域的东西。

全文索引旨在用于全文搜索(即MATCH .. AGAINST查询);它不会与简单的等于或IN()查询有关。

0

当你想使你的查询速度更快,你可以做三两件事:

  • c.name(慢查询添加索引提示,你不有任何)
  • countcategories(带索引),它将包含缓存数据
    WHERE c.count >= 3将只获取有限的成果数量
    HAVING COUNT() >= 3有返回
  • 使用WHERE c.id IN (...),而不是WHERE c.name in ('...)如果可能的话之前,提取所有结果...
    id = identification = PRIMARY KEY,这就是它的意思做
相关问题