[英]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.