如何删除此文件?

时间:2015-04-30 04:37:01

标签: mysql indexing filesort

我有问题,我的慢查询仍在使用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);
}'

解释说:

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

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

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

需要一些帮助,如何摆脱这个文件夹?

1 个答案:

答案 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