mysql - 如何删除这个文件排序?

标签 mysql indexing filesort

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

我的查询如下所示:

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

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

最佳答案

USING FILESORT 是否意味着 MySQL 实际上正在使用文件。这个命名有点“不吉利”。只要数据适合内存,排序就在内存中完成。也就是说,看看变量 sort_buffer_size 。但请记住,这是每个 session 的变量。与服务器的每个连接都会分配此内存。

另一种选择当然是在应用程序级别进行排序。无论如何,您都没有 LIMIT 子句。

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

如果性能确实是一个大问题,请尝试另一种方法,因为 WHERE 中的 OR 使得很难(如果不是不可能的话)摆脱 通过索引使用文件排序。尝试这个查询:

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

关于mysql - 如何删除这个文件排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29959120/

相关文章:

mysql - 使用 "OR"语句时Mysql索引出现问题

mysql - 自定义字段的 Wordpress 搜索自定义查询

python - 元组拆包顺序更改分配的值

MySQL - 加速查询避免文件排序和临时

java - Liquibase 总是生成用于创建/删除索引的变更集

matlab - 如何在Matlab中找到最小10%的数据?

mysql select from table 1 join and order by table 2 优化文件排序

java - 如何从不同的计算机连接到 MySQL 数据库?

php - 如何在单个 PHP 文件中使用不同的表单?

php - 使用 INNER JOIN 问题重复数据