【问题标题】:How to remove this filesort?如何删除此文件排序?
【发布时间】:2015-04-30 04:37:01
【问题描述】:

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

我的查询如下所示:

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

解释是这样说的:

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

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

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

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

【问题讨论】:

  • 请勿在此处张贴文字图片。贴出文字。浪费您的时间和我们的带宽。解释是难以辨认的。

标签: mysql indexing filesort


【解决方案1】:

USING FILESORT 不是的意思是,MySQL 实际上正在使用一个文件。命名有点“倒霉”。只要数据适合内存,排序就在内存中完成。也就是说,看看变量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

【讨论】:

  • 我将查询修改为不使用文件排序并通过 PHP 数组对其进行排序:)
  • @RomanHolic - 使用@fancyPants 查询。它会比您的查询 + PHP 更快! filesort不是反派,是表扫描;罗曼避免了!您将需要以(朋友、状态、最近)和(用户、状态、最近)开头的索引。 Grrrr。
  • 感谢您的帮助,但是当我尝试执行 fancypanths 查询时,它显示错误“#1248 - 每个派生表都必须有自己的别名”...请问您知道出了什么问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-25
  • 1970-01-01
相关资源
最近更新 更多