Как удалить эту сортировку файлов?

У меня проблема, мой медленный запрос все еще использует сортировку файлов. Я не могу избавиться от этого лишнего флага. Не могли бы вы мне помочь?

Мой запрос выглядит так:

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

Нужна небольшая помощь, как избавиться от этой файловой сортировки?

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
Другие вопросы по тегам