2015-06-25 2 views
1

Я следующий MYSQL запрос:Как ускорить этот запрос mySQL (filesort probem)?

select IF(`User`='101',`Friend`,`User`) as `Kto`,`Recent` 
from `friends` 
WHERE (`User`='101' || `Friend`='101') AND `Status`=1 
HAVING `Kto` IN (SELECT `Id` FROM `users` WHERE `Id`=`Kto` AND `Online`>='100') 
ORDER by Recent DESC limit 11 

Использование ORDER by Recent DESC запроса занимает больше времени (Отображение строки 0 - 10 (11 Всего запросов взял 0,0090 сек) [Последние: 9337663 - 7683644])

Если я не использовать Order by, он слишком медленный (показание строк 0 - 10 (всего 11 запросов, 0 0005 сек.))

В объяснительном запросе с ORDER отображает filesort, о котором я думаю, проблема медленности, см. ниже:

enter image description here

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

Большое спасибо.

+0

чтения https://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html – Jens

+0

спасибо за ссылку, но я не то, что является препятствием в моем запросе ... –

ответ

0

Вы можете попробовать это, приятель:

SELECT 
    IF(f.`User`='101',f.`Friend`,f.`User`) as `Kto`, 
    f.`Recent` 
FROM 
    `friends` f 
    INNER JOIN `users` u ON u.`Id` IN (f.`User`, f.`Friend`) 
WHERE 
    (f.`User` = '101' || f.`Friend` = '101') 
    AND f.`Status` = 1 
    AND u.`Online` >= '100' 
ORDER BY 
    f.Recent DESC 
LIMIT 11; 
+0

Благодарим вас за быстрый возврат, но это занимает больше времени (показывая строки 0 - 10 (всего 11 запросов, получено 0,0134 сек) [Recent: 9348273 - 8404480]), возможно, мне следует создать специальный индекс для этого? –

+0

Я так думаю, создание индекса для этого может помочь в скорости выбора запросов. – Avidos

+0

не могли бы вы посоветовать мне, как должен выглядеть этот индекс? Мне нужно создать индекс только для этого конкретного запроса, спасибо заранее –