簡體   English   中英

如何優化SQL查詢?

[英]How to optimize the SQL query?

我有一個SQL查詢,我認為不夠優化。 我計時了,有時需要1.5秒才能完成,這似乎有點高,不是嗎?

無論如何這是查詢:

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

您可以將4 NOT IN子查詢重寫為單個子查詢,並且由於您按items.title分組,您甚至可以消除所有子查詢並使用連接。

這樣,無論你加入什么,你只會加入一次,你可以通過將它們分組成一個更大的邏輯表達式(x = y AND y = z) OR (k = l AND m = n)來重新創建各種比較。

要最有效地優化查詢,您應該首先確定持續時間最長的查詢。 您可以使用SQL事件探查器來完成此操作。 接下來,您將分析查詢以確定他們花費時間的位置以及是否可以對其進行改進。 您可以使用SQL查詢分析器來幫助分析查詢行為。

整個優化過程包括兩個主要步驟:

1)隔離長時間運行的查詢。

2)確定長時間運行查詢的原因。

第1步

  • 您可以使用SQL事件探查器隔離長時間運行的查詢。

第2步

  • 使用SET語句。
  • 使用SQL查詢分析器選項。

使用SQL查詢分析器

SQL查詢分析器以文本模式或圖形模式顯示查詢執行計划。

1)啟動SQL查詢分析器,連接到服務器,然后選擇您正在處理的數據庫。

2)將查詢粘貼到SQL查詢分析器窗口中。

3)如果使用SQL事件探查器跟蹤查詢,則可以從跟蹤窗口復制查詢文本並在SQL查詢分析器中使用。

4)在“ 查詢”菜單上,單擊“ 顯示估計執行計划” 將顯示查詢的估計執行計划。 如果查詢窗口包含多個查詢,則會為每個查詢顯示執行計划。

5)在“ 查詢”菜單上,單擊“ 顯示執行計划” ,然后在查詢窗口中運行查詢。執行計划和查詢結果現在顯示在窗口的單獨窗格中,以便您可以一起查看它們。

我希望這會對你有所幫助!

問候,

尼古拉斯

我試圖在where條件下最小化4 Not In查詢。 你能看到這個有用嗎?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM