MySQL从两个表中选择带有JOIN的随机行

时间:2010-11-17 22:37:02

标签: php mysql

我几天来一直在寻找这个问题的解决方案,找不到任何可以减少运行查询所需的时间。

我有两张桌子:

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

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

我想要选择的是product_db中的随机图片,其中status ='Online'且产品必须位于page id = 3

product_db有超过90,000个产品,product_page有超过150000行。

我现在使用的查询是:

  

SELECT image FROM product_db a,   product_page b WHERE b.page_id = 3 AND   a.status ='在线'和a.unique_id =   b.product_unique_id ORDER BY RAND()   限制1

此查询大约需要2.3秒才能运行。这是一个很长的时间来加载网页。 我尝试了一些其他查询,首先从page_id = 3返回product_page中的随机行,然后查询product_db(它确实减少了所需的时间)但问题是我无法比较产品是否在线“在线”

2 个答案:

答案 0 :(得分:6)

这种排序会减慢你的速度。而不是随机排序,只需选择一个随机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

答案 1 :(得分:1)

问题是MySQL无法选择随机行,因此它会检索所有产品并对其进行排序(不必要)。

您可以编写一个存储过程,在MIN和MAX之间选择一个随机unique_id,然后尝试获取该产品,直到获得该产品。您可以对尝试进行限制。