MySQL - SELECT + JOIN + ORDER BY производительность - PullRequest
2 голосов
/ 29 ноября 2010

У меня две таблицы, мне нужно выбрать некоторые данные, объединенные из обеих них

SELECT f.* 
FROM file_data f
JOIN subscriptions s ON f.uid = s.elementid
WHERE s.uid = 119762 AND f.private=0  
ORDER BY f.date DESC

Теперь, даже для небольшого набора данных, запрос занимает секунду.Это происходит из-за 'filesort' и 'временного', используемого в "подписках", вызванного ORDER BY f.date (удаление этого условия приводит к тому, что время падает ниже 0,01 с)

Может кто-нибудь сказать мне, как ускоритьвверх по запросу?

Вот результат EXPLAIN

id  select_type    table    type   possible_keys    key            key_len  ref           rows  Extra
1    SIMPLE         s        ref    uid_elementid    uid_elementid  4        const         171   Using index; Using temporary; Using filesort
1    SIMPLE         f        ref    uid_uname        uid_uname      5        s.elementid   22    Using where

Ответы [ 3 ]

1 голос
/ 29 ноября 2010

Когда индекс поможет упорядочить заказ по нетривиально.Это очень редко так просто, как «индексировать поля в order by». Эта ссылка содержит мельчайшие детали.Если вы считаете, что у вас правильная индексация, а оптимизатор просто не решает ее использовать, используйте подсказку индекса , чтобы предложить индекс серверу базы данных.

1 голос
/ 29 ноября 2010

Вы должны поставить индекс на f.date

0 голосов
/ 22 января 2017

Я столкнулся с той же проблемой, это мое решение:

SELECT f.* 
FROM (SELECT * FROM file_data WHERE `private`=0 ORDER BY `date` DESC ) f
JOIN subscriptions s ON f.uid = s.elementid
WHERE s.uid = 119762
...