2009-11-28 23 views
0

我有兩個疑問,每個返回節點IDMySQL的沙灘球從NOT IN查詢

SELECT node.nid 
    FROM dpf_node AS node 
WHERE node.type = 'image' AND node.nid; 

SELECT node.nid 
    FROM dpf_node AS node, dpf_image_galleries_images AS image 
WHERE image.image_nid = node.nid 
    AND node.type = 'image' 
    AND image.gallery_nid = 138; 

這兩個列表都正常工作

雖然最後我想要得到的節點ID列表這是在搜索結果的第一列表,而不是在第二,我一直在使用這個查詢:

SELECT node.nid 
    FROM dpf_node AS node 
WHERE node.type = 'image' 
    AND node.nid NOT IN (SELECT node.nid 
          FROM dpf_node AS node, dpf_image_galleries_images AS image 
         WHERE image.image_nid = node.nid 
          AND node.type = 'image' 
          AND image.gallery_nid = 138); 

有一段時間這是工作的罰款,但只是今天晚上是海灘泥包sequal親和造成停下來停下來。我懷疑(/希望)清除數據並重新開始將解決它,但真正想要解決真正的問題,以便在系統正常運行時高枕無憂。

+0

「beach balling sequal pro」:你的意思是MySQL爲這個查詢花費了太多CPU時間? 「導致Apache崩潰」:你的意思是Apache花費了太多的CPU時間? – 2009-11-28 23:45:20

+0

「AND node.nid;」在你的第一個查詢中:打字錯誤? – 2009-11-28 23:46:47

+0

我推測可能是在查詢的第一部分從dpf_node中選擇的每一行都運行NOT IN查詢(括號中的那個)。我沒有足夠的精通MySQL知道如何解決它,但這是一個想法。 – 2009-11-28 23:49:45

回答

1

將其更改爲NOT EXISTS查詢,以幫助提高性能:

SELECT node.nid 
    FROM dpf_node AS node 
WHERE node.type = 'image' 
     AND NOT EXISTS (
     SELECT 1 
     FROM dpf_node AS i_node 
     JOIN dpf_image_galleries_images AS image ON i_node.nid = image.image_nod 
     WHERE node.type = 'image' 
     AND image.gallery_nid = 138 
     AND i_node.nid = node.nid 
     ) 

還應驗證您有足夠的索引。

+0

這也導致崩潰 你是什麼意思是加入了「驗證你有足夠的指標「? – msaspence 2009-11-29 09:55:05

1

MySQL可能會做相當愚蠢的東西與相關的子查詢(查看查詢計劃)。 如果您只是希望第一個查詢中的事情不在第二個查詢中,那麼您可能會從兩個LEFT OUTER JOIN中獲得明顯更好的性能,並使用篩選條件來篩選出具有第二組結果的空值的行。

0

你應該可以用一個選擇來做到這一點。而不是選擇你不想要的所有節點,只要選擇你想要的節點就可以排除它們。如果圖庫和節點之間可能存在很多關係,並且只需要唯一的node.nids,則可以選擇不同的節點。

SELECT node.nid 
FROM dpf_node AS node 
JOIN dpf_image_galleries_images AS image 
    ON node.nid = image.image_nod 
WHERE node.type = 'image' 
AND image.gallery_nid != 138 

根據數據的佈局方式和數量,這應該比where子句子查詢執行得更好。而且它更容易理解。

+0

這不起作用,因爲連接將選擇node.nid,該圖像已連接到另一個畫廊,並且distinct將不會過濾掉它們,只將它們減少到一行 – msaspence 2009-11-29 09:53:10

+0

我已重建數據並且按照預測它正在工作罰款 雖然我聽到你說什麼試圖讓它做到一個選擇 我只是不知道如何修改您的查詢,以防止在以前的評論descibed的問題 – msaspence 2009-11-29 10:05:00