繁体   English   中英

MySQL db 正在使用“使用 where; 使用临时的; 按日期排序时使用文件排序

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM