2015-05-15 4 views
3

У меня проблема с запросом, для выполнения которого требуется слишком много времени. Это мой запросЗапрос занимает слишком много времени для выполнения

SELECT U.user_id, C.c_id, U.username, U.email, R.reply 
FROM users U, conversation C, conversation_reply R 
WHERE CASE 
WHEN C.user_one =1 
THEN C.user_two = U.user_id 
WHEN C.user_two =1 
THEN C.user_one = U.user_id 
END 
AND C.c_id = R.c_id_fk 
AND (
C.user_one =1 
OR C.user_two =1 
) 
ORDER BY C.c_id DESC 

У меня есть 250788 общего Recoderds в conversation_reply таблицы, хранящие сведения о сообщении, то этот запрос дает 10225 записей в результате, и принять 7.291 сек.

Пожалуйста, дайте мне правильное решение.

+0

Хотите ли вы, чтобы все они были на одной странице? –

+0

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

+0

Спасибо, я уже проиндексировал. –

ответ

1

Вы должны ограничить поиск.

'...ORDER BY C.c_id DESC LIMIT 100' 

чем после того, как вам показать первые 100 mesages вы можете AJAX для остальных из них, так что нагрузка будет в фоновом режиме.

+0

Спасибо. Но мне нужна запись 1000 на первой странице, так что я устанавливаю предел 1000, а затем занимает много времени (3,9194 сек). –

+0

Я не знаю, что вы делаете, но для веб-страниц вы можете загружать информацию 1 на 1, или 10 на 10 :) –

1

Вы можете указать базе данных, чтобы принудительно использовать любой индекс.

USE INDEX (index1,index2) 
Смежные вопросы