2015-07-31 2 views
2

У меня есть этот запрос:медленный запрос MySQL при использовании ORDER BY

SELECT article.id 
FROM article 
INNER JOIN article_cCountry ON article.id = ID1 AND ID2 = 1 
INNER JOIN user_cCountry ON article.uId = user_cCountry.ID1 AND user_cCountry.ID2 = 1 
LEFT JOIN user ON article.uId = user.ID 
WHERE article.released = "TRUE" 
AND article.sDate < now() 
AND article.cDate != "0000-00-00 00:00:00" 
AND (article.eDate > now() OR article.eDate = 0) 
AND ((user.released = true) OR (article.uId = 0)) 
ORDER BY article.cDate DESC 
LIMIT 0, 10 

Запрос занимает ~ 0,3 секунды, без ORDER BY только ~ 0,001 секунды.

Любые идеи, почему ORDER BY так медленно?

EDIT EXPLAIN: enter image description here

EDIT 2 INDEXES enter image description here

+0

Что показывает 'explain select ...', похоже, что столбец, используемый в предложении order by, не индексируется. –

+0

@AbhikChakraborty разделе Редактирование – grundig

+0

Проверить эту ссылку http://stackoverflow.com/questions/14368211/mysql-very-slow-order-by –

ответ

3

Без ORDER BY Ваш запрос будет оканчиваются после 10 строк (LIMIT).

С ORDER BY полный набор результатов должен быть сгенерирован, отсортирован, а затем будут возвращены первые 10 строк.

0

Хотя вы никогда не может достичь скорости вывода только 10 строк против принятия всех строк, а затем сортировать их и затем выводит первые 10, вы можете сделать небольшой трюк, чтобы заказать набор записей в памяти

SELECT id FROM (
SELECT article.id,article.cDate 
FROM article 
INNER JOIN article_cCountry ON article.id = ID1 AND ID2 = 1 
INNER JOIN user_cCountry ON article.uId = user_cCountry.ID1 AND user_cCountry.ID2 = 1 
LEFT JOIN user ON article.uId = user.ID 
WHERE article.released = "TRUE" 
AND article.sDate < now() 
AND article.cDate != "0000-00-00 00:00:00" 
AND (article.eDate > now() OR article.eDate = 0) 
AND ((user.released = true) OR (article.uId = 0)) 
) 
ORDER BY cDate DESC 
LIMIT 0, 10 

Надежда, что помогает

+0

, к сожалению, нет. Скорость такая же: – grundig

0
INDEX(released, cDate) 

может помочь

избежать OR может помочь.

0

Вашего ORDER BY колонок (article.cDate) должен быть проиндексирован, это остановит ORDER BY article.cDate занимает много времени, так как значения столбцов будут индексироваться и затем может быть организовано экспоненциально быстрее.

+0

колонка индексируется – grundig