我有一堆记录的数据库,当我用下面的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
请张贴充分解释输出和表结构。顺便说一句,在另一列上分组时,MySQL不能使用索引进行排序(这就是为什么你会看到使用filesort)。 – Galz
有'goal.private'上的索引吗?如何使用'private = 0'选择行,以及该表总共有多少行? –
请将附加信息(例如'EXPLAIN'的输出)添加到您的问题中。作为评论,它不太可读。 – Mike