簡體   English   中英

MySQL從兩個表中用JOIN選擇隨機行

[英]MySQL select random row with JOIN from two tables

我一直在尋找針對該問題的解決方案已有幾天,但找不到任何可以減少運行查詢時間的方法。

我有2張桌子:

"product_db":  
unique_id - [index] 
image 
url_title 
status - [index]

"product_page"
id
product_unique_id - [index]
page_id - [index]

我要選擇的是product_db中的一個隨機圖像,其中status ='Online'並且產品必須在頁面id = 3中

product_db有超過90,000個產品,product_page有超過150000行。

我現在使用的查詢是:

從product_db a,product_page b中選擇圖像,其中b.page_id = 3 AND a.status ='在線'AND a.unique_id = b.product_unique_id ORDER BY RAND()限制1

該查詢大約需要2.3秒才能運行。 網頁加載時間很長。 我嘗試了其他一些查詢,這些查詢首先從product_page返回一個具有page_id = 3的隨機行,然后查詢product_db(它確實減少了所需的時間),但是問題是我無法比較產品是否為“在線” 。

排序使您放慢了腳步。 而不是隨機排序,只需選擇一個隨機product_db.unique_id

在查詢中,將ORDER BY RAND()替換為:

AND product_db.unique_id >= ROUND(RAND()*(SELECT MAX(unique_id) FROM product_db))

如果從數據庫中刪除了unique_id,請使用>=代替= 結果的隨機性不如按rand排序,但查詢執行得更快。 如果願意,可以使用=運行多個查詢,直到找到結果為止,它可能仍然比對所有這些結果進行排序要快得多。

使用顯式的JOIN它將是:

SELECT product_db.image
FROM product_db
JOIN product_page ON product_db.unique_id = product_page.product_unique_id
WHERE product_page.page_id = 3 
AND product_db.status = 'Online' 
AND product_db.unique_id >= ROUND(RAND()*(SELECT MAX(unique_id) FROM product_db))
LIMIT 1

問題在於MySQL無法選擇隨機行,因此它會檢索所有產品並對其進行排序(不必要)。

您可以編寫一個存儲過程,在MIN和MAX之間選擇一個隨機的unique_id ,然后嘗試獲取該乘積,直到獲得乘積。 您可以限制嘗試次數。

暫無
暫無

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

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