我有问题,我的缓慢查询仍在使用文件排序。 我无法摆脱这个额外的标志。你能帮我一下吗?
我的查询如下所示:
select `User`,
`Friend`
from `friends`
WHERE
(`User`='3053741' || `Friend`='3053741')
AND `Status`='1'
ORDER by `Recent` DESC;
解释一下:
我的表结构和索引(它是斯洛伐克语,但应该是相同的):
需要一点帮助,如何摆脱这个文件排序?
最佳答案
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/