2013-04-04 6 views
2

Это очень простой запрос занимает много времени:Могу ли я оптимизировать этот запрос?

SELECT text, url, docid 
FROM retrieve 
LEFT JOIN citations2 
ON citations2.fromdoc = retrieve.docid 
WHERE citations2.todoc IS NULL 
LIMIT 10; 

Он имеет левое соединение с условием NULL ... это может быть причиной? Я поставил индексы повсюду.

Вот лог медленных запросов:

# Time: 130404 8:00:31 
# [email protected]: em[em] @ zebra [130.239.162.142] 
# Query_time: 27.006579 Lock_time: 0.000019 Rows_sent: 0 Rows_examined: 90682 
use em_bg04; 
SET timestamp=1365055231; 
SELECT text, url, docid FROM retrieve LEFT JOIN citations2 ON citations2.fromdoc = retrieve.docid WHERE citations2.todoc IS NULL LIMIT 10; 

Вот схематическое изображение задействованных таблиц, вместе с размерами (держать прокрутки вниз, чтобы увидеть результаты EXPLAIN для запроса)

Table citations2

Table retrieve

Вот вывод EXPLAIN:

enter image description here

Таким образом, кажется, что он должен пройти через весь стол ... Я, конечно, читал this, но я не могу понять это. Итак, есть ли способ сделать этот запрос быстрее?

+0

Попробуйте добавить где положение в '' ON' пункта ВЫБРАТЬ текст, URL, DocId ОТ получить LEFT JOIN citations2 ON citations2.todoc IS NULL AND citations2.fromdoc = retrieve.docid LIMIT 10; ' – Meherzad

+0

@Meherzad Теперь гораздо лучше! Спасибо (если вы скопируете свой комментарий к ответу, я его приму) – dsign

ответ

2

Попробуйте этот запрос

Вы принимаете преимущество короткого замыкания, так что, если первое условие становится ложным это не пойдет для проверки второго условия ..

Надеется, что это помогает ...

SELECT 
    text, 
    url, 
    docid 
FROM 
    retrieve 
LEFT JOIN 
    citations2 
ON 
    citations2.todoc IS NULL AND 
    citations2.fromdoc = retrieve.docid 
LIMIT 10; 
+0

Уверен, что это помогает! Благодаря! – dsign

+0

+1 отлично подходит для меня –

+0

Рад помочь .... :) – Meherzad

1

Запрос Meherzads выглядит перспективным. Но я бы использовал его запрос в сочетании с недавно созданным индексом

IDX_FROMDOC_TODOC который содержит обе колонки.

+0

Спасибо за ваше предложение. Считаете ли вы, что оптимизатор сможет использовать составной индекс в запросе, написанный @Meherzad? Я знаю, что я должен попробовать себя и посмотреть, но это означало бы остановить некоторые вещи сейчас :-( – dsign

+0

Я бы попробовал индекс наоборот, 'todoc_fromdoc', чтобы соответствовать порядку, в котором столбцы проверяются в тесте. , однако, на сколько столбцов есть NULL 'todoc', это может вообще не помогать. –

Смежные вопросы