2016-06-18 5 views
0

Я новичок в программировании, и этот форум так голый со мной. Я использую этот запрос на своем веб-сайте, чтобы найти список ToDo на основе определенных критериев. Но он работает слишком медленно, и, вероятно, можно написать его по-другому.Как это сделать быстрее?

SELECT * FROM lesson WHERE 
id IN 
(SELECT `lesson_id` FROM `localization_logging` 
WHERE `language_id` = 2 AND `action_id` = 1) 
AND `id` NOT IN 
(SELECT `lesson_id` FROM `localization_logging` 
WHERE `language_id` = 2 AND `part_id` = 1 AND `action_id` = 6) 

Что запрос делает то, что он смотрит в таблицу урока, чтобы найти все имена список уроков, а затем проверяет, является ли конкретная задача выполнена. Если задача выполняется в одном списке, чем в следующем. Действие 1 выполняется, но не действие 6 в этом случае.

Надеюсь, я объясню это достаточно хорошо. На моей локальной машине запрос занимает 1,8 секунды, и иногда мне приходится печатать несколько списков рядом друг с другом, а затем он занимает в 1,8 раза больше списков, что делает загрузку страницы очень медленной.

Спасибо за помощь, которую я могу получить!

+0

Прежде всего, чтобы увидеть, что делает база данных: EXPLAIN yourQuery; и опубликуйте результат, тогда мы сможем увидеть, что произошло –

ответ

0

Нечто подобное для марки ид завершенным:

SELECT l.*, SUM(ll.action_id=6) completed FROM lesson l 
INNER JOIN localization_logging ll ON ll.lesson_id = l.id 
WHERE ll.language_id = 2 AND 
(
ll.action_id = 1 
    OR 
ll.action_id = 6 AND ll.part_id == 1 
) 
GROUP BY l.id 

И теперь мы можем обернуть его:

SELECT t.* FROM (...) t WHERE t.completed = 0 
0

Вы обычно получаете более быстрые запросы фильтрации строк с INNER/LEFT JOIN, но вам нужно проверить его.

SELECT lesson.* FROM lesson 
INNER JOIN localization_logging task1 
    ON lesson.id = task1.lesson_id 
LEFT JOIN localization_logging task2 
    ON lesson.id = task2.lesson_id 
    AND task2.language_id = 2 
    AND task2.part_id = 1 
    AND task2.action_id = 6 
WHERE task1.language_id = 2 
AND task1.action_id = 1 
AND task2.lesson_id IS NULL 

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

КПП. Вы получите несколько строк от lesson, если условие task1 не ограничивает результаты одной строкой - GROUP BY lesson.id.

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