2012-08-16 90 views
1

我有一个SQL查询,我认为没有足够优化。我计时,有时需要1.5秒才能完成,这似乎有点高,不是吗?如何优化SQL查询?

反正这是查询:

SELECT id, link, feed, category, description, title, GROUP_CONCAT(tag) as t, published 
      FROM items 
      LEFT JOIN tags ON items.id = tags.item_id 
      WHERE id NOT IN (
       SELECT item_id 
       FROM tags, sinunim 
       WHERE tag = name 
       AND op = '1' 
       AND user = '$user_cookie' 
      ) AND id NOT IN (
       SELECT id 
       FROM sinunim 
       WHERE id <> 0 
       AND user = '$user_cookie' 
      ) AND id NOT IN (
       SELECT i.id 
       FROM sinunim s, items i 
       WHERE s.type = 'category' 
       AND s.name = i.category 
       AND s.op = '1' 
       AND s.user = '$user_cookie' 
      ) AND id NOT IN (
       SELECT i.id 
       FROM `sinunim` s, items i 
       WHERE s.name = i.feed 
       AND s.op = '1' 
       AND s.user = '$user_cookie' 
      ) 
      GROUP BY items.title 
      ORDER BY items.published DESC 
      LIMIT 0 , 50 
+0

你应该使用内连接,而不是交叉与在(FROM表1,表2,其中..是一个交叉连接)加入 – 2012-08-16 12:37:05

+5

无意冒犯,但我认为所有优化会谈应以展开的“EXPLAIN”结果开始。 )是的,通过嵌套查询加入看起来不太正确。 – raina77ow 2012-08-16 12:37:31

+0

@ElVieejo技术上它(交叉或内部)取决于在WHERE块中指定的标准。不过,我同意重写它会更可读。 – raina77ow 2012-08-16 12:39:11

回答

2

您可以重写4个NOT IN子查询作为一个单独的子查询,因为你被items.title分组,你甚至可以消除所有的子查询和使用,而不是连接。

无论你加入这样将只参加一次,你可以在一个更大的逻辑表达(x = y AND y = z) OR (k = l AND m = n)将它们分组重新创建各种比较。

+0

谢谢,这是我正在采取的方向... – 2012-08-20 12:05:20

+0

它应该是最高效的,因为它允许SQL查询计划器和SQL查询优化器高效地工作。 – 2012-08-20 12:16:00

0

我试图不减少4在查询在状态。你能看到这个作品与否?

SELECT id, link, feed, category, description, title, GROUP_CONCAT(tag) as t, published 
      FROM items 
      LEFT JOIN tags ON items.id = tags.item_id 
      WHERE id NOT IN (
       SELECT case 
         when (tag = name AND op = '1') then item_id 
         when id <> 0 then id 
         END 
       FROM tags, sinunim 
       WHERE user = '$user_cookie' 
      ) 
      AND id NOT IN (
       SELECT i.id 
       FROM sinunim s, items i 
       WHERE ((s.type = 'category' 
       AND s.name = i.category) OR s.name = i.feed) 
       AND s.op = '1' 
       AND s.user = '$user_cookie' 
      ) 
      GROUP BY items.title 
      ORDER BY items.published DESC 
      LIMIT 0 , 50 
1

要最有效地优化查询,您应该首先确定持续时间最长的查询。你可以通过使用SQL Profiler来完成。接下来,您分析查询以确定他们在哪里花费时间以及是否可以改进。您可以使用SQL查询分析器来帮助分析查询行为。

的整体优化过程包括两个主要步骤:

1)隔离长时间运行的查询。

2)识别长时间运行的查询的原因。

步骤1

  • 您可以隔离使用SQL事件探查长时间运行的查询。

步骤2

  • 使用SET语句。
  • 使用SQL查询分析器选项。

要在文本模式或图形模式SQL查询分析器

SQL查询分析器显示查询执行计划。

1)启动SQL查询分析器,连接到服务器,然后选择您正在使用的数据库。

2)粘贴到查询的SQL查询分析器窗口。

3)如果您使用SQL事件探查器跟踪查询,查询文本可以从跟踪窗口复制SQL查询分析器中使用。

4)在查询菜单上,单击显示预计执行计划。显示查询的估计执行计划。如果查询窗口包含多个查询,则会为每个查询显示一个执行计划。

5)在查询菜单上,单击显示执行计划,然后运行查询window.Execution计划和查询结果现在出现在窗口中的单独的窗格,这样你们就可以一起查看他们的查询。

我希望这会帮助你!

问候,

尼古拉斯

+0

他没有使用SQl服务器 – HLGEM 2012-08-16 14:13:01