2012-07-07 66 views
0

這是用於在線照片庫的。我有兩張桌子; 「photoSearch」和「照片」。第一個「photoSearch」只有幾列,包含照片的所有可搜索數據,如「photoID」,「標題」,「標題」,「人物」,「dateCaptured」和「關鍵字」。它有一個多列全文索引(標題,標題,人物,關鍵字)。第二個表格「照片」包含所有照片數據;高度,寬度,版權,標題,ID,日期等等。兩者都有500K +行,標題和標題字段有時會返回2000+個字符。 (注意事項:我不能在全文搜索中使用連接,因此關鍵字存儲在一個列中 - 在一個「非規範化」表中。此外,這種類型的僞代碼因爲我的應用程序代碼在其他地方 - 但它很接近)如何將這兩個查詢合併爲一個優化查詢以避免選擇N + 1

這個特定的查詢正在通過與循環內循環,正在執行另一個SQL語句...

SELECT photoID FROM photoSearch 
WHERE MATCH (headline, caption, people, keywords) 
AGAINST ('"&booleanSearchStr&"' IN BOOLEAN MODE) 
AND dateCaptured BETWEEN '"&fromDate&"' AND '"&toDate&"';" 

這是正在執行的SQL語句對於上面查詢中的每一行:

SELECT photoID, setID, eventID, locationID, headline, caption, instructions, dateCaptured, dateUploaded, status, uploaderID, thumbH, thumbW, previewH, previewW, + more 
FROM photos 
LEFT JOIN events AS e USING (eventID) 
LEFT JOIN location AS l USING (locationID) 
WHERE photoID = " & photoID & ";" 

當測試時,在其自己的表格上使用全文索引時,「photoSearch」而不是大表格「照片」似乎在一定程度上提高了速度。我沒有添加「photoSearch」表,它已經存在 - 這不是我的應用程序。如果我嘗試加入這兩個表以失去第二個查詢,那麼我會一起丟失索引,導致很長時間 - 所以我無法使用全文連接。這似乎是最快的方法。如果不是全文和加入問題,我已經將這兩個查詢結合起來了。

是否有可能將這兩個查詢合併爲一個,以使進程運行更有效率,而不是對查詢1中的每個結果執行1000次查詢#2?

+0

才能添加您嘗試加入的SQL? – 2012-07-07 05:38:43

回答

0

如果加入沒有工作,嘗試一個子查詢:

SELECT photoID, setID, eventID, locationID, headline, caption, instructions, dateCaptured, dateUploaded, status, uploaderID, thumbH, thumbW, previewH, previewW, + more 
FROM (
    SELECT photoID 
    FROM photoSearch 
    WHERE 
     MATCH (headline, caption, people, keywords) 
      AGAINST ('"&booleanSearchStr&"' IN BOOLEAN MODE) 
     AND dateCaptured BETWEEN '"&fromDate&"' AND '"&toDate&"';" 
) as SelectedPhotos 
LEFT JOIN photos USING (photoID) 
LEFT JOIN events AS e USING (eventID) 
LEFT JOIN location AS l USING (locationID) 

或試圖找出爲什麼加入沒有工作,我應該用:

SELECT photoID, setID, eventID, locationID, headline, caption, instructions, dateCaptured, dateUploaded, status, uploaderID, thumbH, thumbW, previewH, previewW, + more 
FROM photoSearch 
LEFT JOIN photos USING (photoID) 
LEFT JOIN events AS e USING (eventID) 
LEFT JOIN location AS l USING (locationID) 
WHERE 
    MATCH (headline, caption, people, keywords) 
     AGAINST ('"&booleanSearchStr&"' IN BOOLEAN MODE) 
    AND dateCaptured BETWEEN '"&fromDate&"' AND '"&toDate&"';"