2011-07-22 60 views
1

我有一堆记录的数据库,当我用下面的SQL加载页面时,它确实很慢。当按日期排序时,MySQL数据库正在使用“使用where;使用临时文件;使用filesort”

SELECT goal.title, max(updates.date_updated) as update_sort 
FROM `goal` 
LEFT OUTER JOIN `update` `updates` ON (`updates`.`goal_id`=`goal`.`goal_id`) 
WHERE (goal.private=0) 
GROUP BY updates.goal_id 
ORDER BY update_sort desc 
LIMIT 12 

当我做一个解释说它不使用任何键和它的每一行搜索。还告诉我它使用“使用where;使用temporary;使用filesort”。

任何帮助深表感谢

感谢


它需要由因为在选择MAX()的goal_id分组将返回只有一行。

我想要做的是从updates表中为每个目标返回MAX date_updated行,然后按该列对其进行排序。


目前的指数都在goal.private和update.goal_id详解(不能上传图片的


输出,所以必须把它放在这里,对不起,如果它不是明确:

id select_type  table type possible_keys key   key_len  ref   rows Extra 
1 SIMPLE   goal ref  private   private  1   const   27 Using temporary; Using filesort 
1 SIMPLE   updates ref  goal_id   goal_id  4   goal.goal_id 1  
+4

请张贴充分解释输出和表结构。顺便说一句,在另一列上分组时,MySQL不能使用索引进行排序(这就是为什么你会看到使用filesort)。 – Galz

+0

有'goal.private'上的索引吗?如何使用'private = 0'选择行,以及该表总共有多少行? –

+0

请将附加信息(例如'EXPLAIN'的输出)添加到您的问题中。作为评论,它不太可读。 – Mike

回答

0

我的猜测是MAX()函数会导致这种行为,它需要查看每条记录来决定选择哪些行,你试图完成什么样的分组?

+0

似乎对结果返回假结果时,我不分组 – user857492

+0

不知道是什么造成的假计数,但它修复它,当我分组。有任何想法吗 ? – user857492

+0

你是什么意思的假结果?它是零吗?你可以添加一个示例结果集到你的问题吗? – Johan

1
SELECT u.date_updated, g.title 
FROM updates u 
JOIN goal g 
ON  g.goal_id = u.goal_id 
WHERE u.id = 
     (
     SELECT ui.id 
     FROM updates ui 
     WHERE ui.goal_id = u.goal_id 
     ORDER BY 
       ui.goal_id, ui.date_updated, ui.id 
     LIMIT 1 
     ) 
     AND g.private = 0 
ORDER BY 
     u.date_update, u.id 
LIMIT 12 

创建于updates两个指标的查询工作,快捷:

updates (goal_id, date_updated, id) 
updates (date_updated, id) 
+0

仍然看起来是用这个方法临时使用的 – user857492

+0

@user:请发布SHOW CREATE TABLE updates和SHOW CREATE TABLE goal以及'EXPLAIN EXTENDED'的输出结果# – Quassnoi

+0

@user:你还没有创建'update'上的两个索引。如果你想摆脱'filesort',创建它们。另外,请发布'SHOW CREATE TABLE updates'和'SHOW CREATE TABLE goal'的输出。 – Quassnoi

相关问题