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