簡體   English   中英

如何將這兩個查詢合並為一個優化查詢以避免選擇N + 1

[英]How to combine these two queries into one optimized query to avoid a Select N+1

這是用於在線照片庫的。 我有兩個桌子。 “ photoSearch”和“照片”。 第一個是“ photoSearch”,只有幾列,其中包含照片的所有可搜索數據,例如“ photoID”,“標題”,“標題”,“人物”,“ dateCaptured”和“關鍵字”。 它具有關於(標題,標題,人員,關鍵字)的多列全文索引。 第二張表“照片”包含所有照片數據。 高度,寬度,版權,標題,ID,日期等。 兩者都有500K +行,並且標題和標題字段有時會返回2000+個字符。

這大約是查詢現在的樣子:(注意事項:我無法將聯接與全文搜索一起使用,因此關鍵字被存儲在“非規范化”表的一列中。此外,這種偽代碼作為我的應用程序代碼在其他地方-但很近)

這個特定的查詢正在循環中並且在循環內部,正在執行另一個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”上有全文索引,而不是在大表“ photos”上,似乎在一定程度上提高了速度。 我沒有添加“ photoSearch”表,該表已經存在-這不是我的應用程序。 如果我嘗試將兩個表連接起來以丟失第二個查詢,那么我的索引將全部丟失,這將導致很長的時間-因此,我無法使用全文連接。 這似乎是最快的方法。 如果不是針對全文和聯接問題,我已經將這兩個查詢合並了。

是否可以將這兩個查詢合並為一個,以使過程更有效地運行,而不是對查詢1中的每個結果執行#2查詢1000次?

如果聯接不起作用,請嘗試子查詢:

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&"';"

暫無
暫無

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

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