如何删除此文件排序?

How to remove this filesort?

我有问题,我的慢速查询仍在使用文件排序。 我无法摆脱这个额外的标志。你能帮帮我吗?

我的查询如下所示:

select `User`,
       `Friend` 
from `friends` 
WHERE 
     (`User`='3053741' || `Friend`='3053741') 
     AND `Status`='1' 
ORDER by `Recent` DESC;

解释是这样说的:

http://blindr.eu/stack/1.jpg

我的table结构和索引(是斯洛伐克语,但应该是一样的):

http://blindr.eu/stack/2.jpg

需要一点帮助,如何摆脱这个文件排序?

USING FILESORT 不是 的意思是,MySQL 实际上是在使用一个文件。命名有点"unlucky"。只要数据适合内存,排序就在内存中完成。也就是说,看看变量 sort_buffer_size。但请记住,这是每个会话变量。每次连接到您的服务器都会分配此内存。

另一种选择当然是在应用程序级别进行排序。反正你没有 LIMIT 子句。

哦,你的索引太多了。当只使用最左边的列时,也可以使用组合索引。所以你的一些索引是多余的。

如果性能真的是个大问题,请尝试另一种方法,因为 WHERE 中的 OR 很难(如果不是不可能的话)摆脱 using filesort通过索引。试试这个查询:

SELECT * FROM (
    select "this is a user" AS friend_or_user, `User`, Recent
    from `friends` 
    WHERE 
         `User`='3053741' 
         AND `Status`='1' 

    UNION ALL

    select "this is a friend", 
           `Friend`, Recent
    from `friends` 
    WHERE 
         `Friend`='3053741'
         AND `Status`='1' 
) here_needs_to_be_an_alias
ORDER by `Recent` DESC