[英]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.lastLogin
列profile_friends
与指数(member_id,lastLogin)
。 这样一来,您将无需加入,没有文件排序,什么也没有。 另一方面,每次有很多朋友的人登录时,您都会有较大的UPDATE查询。同样,对于您所谈论的数字来说,这似乎完全过头了。
我几乎忘了回答原始问题:
使用临时,使用Filesort在mysql中是个坏主意?
不,这不对。 如果可以轻松地对其进行优化,则应始终寻求“无文件排序”查询,否则,除非它们带来了真正的性能问题,否则您不必担心。 Filesort是查询正常执行的一部分。
这是编写该查询的最有效方法。
确保pf.friend_id
, pf.member_id
和m.id
都有索引。 然后它将使用索引来联接表并过滤结果。
无论如何,由于您的order by
这种排序即将到来。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.