[英]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步
第2步
使用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.