[英]MySQL db is using “Using where; Using temporary; Using filesort” when sorting by date
我有一个包含一堆记录的数据库,当我使用以下 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 的 output (无法上传图片,所以如果不清楚,请把它放在这里抱歉:
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
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)
我的猜测是 MAX() function 会导致这种行为。 它需要查看每条记录以确定 select 的行。 你想完成什么样的分组?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.