繁体   English   中英

使用临时,使用Filesort在mysql中是个坏主意?

[英]Using temporary, using filesort a bad idea in mysql?

我试图优化我的mysql查询,以避免“使用临时,使用文件排序”。 我可以帮忙。 第一; 这是解释

这是查询

select pf.*,m.login,m.avatar 
from profile_friends pf, members m  
where pf.friend_id = m.id and pf.member_id = 16586 
order by m.lastLogin desc 
limit 0,24;


mysql> EXPLAIN select pf.*,m.login,m.avatar from profile_friends pf, members m  where pf.friend_id = m.id and pf.member_id = 16586 order by m.lastLogin desc limit 0,24;
+----+-------------+-------+--------+-----------------------------------------------------+-----------------+---------+--------------------------+------+----------------------------------------------+
| id | select_type | table | type   | possible_keys                                       | key             | key_len | ref                      | rows | Extra                                        |
+----+-------------+-------+--------+-----------------------------------------------------+-----------------+---------+--------------------------+------+----------------------------------------------+
|  1 | SIMPLE      | pf    | ref    | member_id_index,friend_id_index                     | member_id_index |       4 | const                    |  160 | Using where; Using temporary; Using filesort |
|  1 | SIMPLE      | m     | eq_ref | PRIMARY,member_id_privacy_index,id_last_login_index | PRIMARY         |       4 | mydb.pf.friend_id        |    1 | Using where                                  |

有2个表。 ProfileFriends(pf)和Members(m)。 该查询正试图为此特定会员ID查找“最近”的24个朋友。 最近的均值按LastLogin日期排序。

谢谢

有问题吗? 是的

处理160行时是否有问题? 不。

“文件排序”是一种方法,而不是文件的实际创建和排序。 如果我们谈论的是160,000行而不是160行,则可能有理由考虑进一步优化。

编辑:此外,您省略了实际的查询运行时间。 您要命中索引,并且只能处理少量行。 如果此查询花费的时间不超过一秒的几分之一,那么即使进行优化也可能不值得。

我认为您应该能够避免对members (id,lastLogin)进行索引的临时/文件members (id,lastLogin) 顺序 members (id,lastLogin) 但是对于这种类型的查询来说,这是过分的,并且通过EXPLAIN判断,看来您已经尝试过了?

您可以在profile_friends (member_id,friend_id)上使用PRIMARY / UNIQUE KEY对其进行补充profile_friends (member_id,friend_id)并查看其工作原理。

在最后的手段,如果执行该查询经常,有这么多的记录,你必须拥有最快的选择可能,你可以进行非规范化你的表和你的副本添加members.lastLoginprofile_friends与指数(member_id,lastLogin) 这样一来,您将无需加入,没有文件排序,什么也没有。 另一方面,每次有很多朋友的人登录时,您都会有较大的UPDATE查询。同样,对于您所谈论的数字来说,这似乎完全过头了。

我几乎忘了回答原始问题:

使用临时,使用Filesort在mysql中是个坏主意?

不,这不对。 如果可以轻松地对其进行优化,则应始终寻求“无文件排序”查询,否则,除非它们带来了真正的性能问题,否则您不必担心。 Filesort是查询正常执行的一部分。

这是编写该查询的最有效方法。

确保pf.friend_idpf.member_idm.id都有索引。 然后它将使用索引来联接表并过滤结果。

无论如何,由于您的order by这种排序即将到来。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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