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

Jam*_*mes 4 php mysql

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

我有2张桌子:

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

"product_page"
id
product_unique_id - [index]
page_id - [index]
Run Code Online (Sandbox Code Playgroud)

我想要选择的是product_db中的随机图像,其中status ='Online'且产品必须在页面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 ='Online'AND a.unique_id = b.product_unique_id ORDER BY RAND()LIMIT 1

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

web*_*ave 6

这种排序会减慢你的速度.而不是随机排序,只需选择一个随机product_db.unique_id

在您的查询中,替换ORDER BY RAND()为:

AND product_db.unique_id >= ROUND(RAND()*(SELECT MAX(unique_id) FROM product_db))
Run Code Online (Sandbox Code Playgroud)

使用>=而不是=从数据库中删除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
Run Code Online (Sandbox Code Playgroud)