我有问题,我的慢查询仍在使用filesort。 我无法摆脱这个额外的旗帜。你能帮我吗?
我的查询如下:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}'
解释说:
我的表结构和索引(它是斯洛伐克语,但它应该是相同的):
需要一些帮助,如何摆脱这个文件夹?
答案 0 :(得分:1)
USING FILESORT
不意味着MySQL实际上正在使用文件。命名有点“不吉利”。只要数据适合内存,就可以在内存中完成排序。也就是说,看一下变量sort_buffer_size
。但请记住,这是一个每会话变量。与服务器的每个连接都会分配此内存。
另一种选择当然是在应用程序级别进行排序。无论如何,你没有LIMIT
条款。
哦,你的索引太多了。仅使用最左侧的列时,也可以使用组合索引。所以你的一些索引是多余的。
如果性能真的是一个问题,请尝试另一种方法,因为OR
中的WHERE
会使(如果不是不可能的话)通过索引摆脱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