【发布时间】:2011-07-22 07:56:47
【问题描述】:
我有一个包含一堆记录的数据库,当我使用以下 SQL 加载页面时,它真的很慢。
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
当我进行解释时,它说它不使用任何键并且它搜索每一行。还告诉我它使用“使用位置;使用临时;使用文件排序”。
非常感谢任何帮助
谢谢
它需要按goal_id 分组,因为select 中的MAX() 只返回一行。
我要做的是从updates 表中为每个目标返回 MAX date_updated 行,然后按该列对其进行排序。
当前索引位于 goal.private 和 update.goal_id
EXPLAIN 的输出(无法上传图片,如果不清楚,请放在这里抱歉:
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 不能使用索引进行排序(这就是您看到
using filesort的原因)。 -
goal.private上有索引吗?使用private=0可以选择多少行,该表总共有多少行? -
请在您的问题中添加其他信息,例如
EXPLAIN的输出。作为评论,它不是很可读。 -
同时将所有当前索引发布到表中。
标签: mysql sql database query-optimization