如何使此查询运行得更快

时间:2016-06-18 09:52:04

标签: php mysql

我在我的网站上运行此查询,以便根据特定条件查找待办事项列表。但它运行得太慢,可能以另一种方式编写它。

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倍的列表,这使得页面加载速度超慢。

2 个答案:

答案 0 :(得分:0)

像标记ID一样完成这样的事情:

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

答案 1 :(得分:0)

您通常会使用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子句中列出它们,因为只有结果中的结果才会强制加入" as nulls(左连接意味着左侧不管是什么)都是必需的。

顺便说一下。如果task1条件没有将结果限制为一行,那么您将从GROUP BY lesson.id获得多行 - {{1}}。