我有一个包含大量记录的数据库,当我使用以下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
当我做一个解释时,它表示它没有使用任何键,而是搜索每一行。还告诉我它使用“使用where;使用临时;使用filesort”。
非常感谢任何帮助
由于
需要按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
答案 0 :(得分: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)
答案 1 :(得分:0)
我的猜测是MAX()函数会导致这种行为。它需要查看每条记录以确定要选择的行。你想要完成什么样的分组?