MySQL从两个表中选择随机行加入连接

问题描述:

我一直在寻找这个问题的解决方案几天,并找不到任何可以减少运行查询所花费的时间。MySQL从两个表中选择随机行加入连接

我有2个表:

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

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

我想选择是从product_db随机图像,其中状态=“在线”,产品必须在页面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.3secs运行。网页加载时间相当长。 我已经尝试了一些其他查询,第一次返回从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 
+0

嗨,我只是尝试这样的查询并返回一个错误: – James 2010-11-17 23:12:51

+0

SELECT映像从product_db一,product_page b WHERE b.page_id = 3 和a.status = '在线' 和a.unique_id = b.product_unique_id AND a.unique_id> = ROUND(RAND()* MAX(a.id)) – James 2010-11-17 23:13:22

+0

#1111 - 组函数的使用无效 我错过了什么吗? – James 2010-11-17 23:14:06

问题是,MySQL没有办法选择一个随机行,所以它检索所有的产品并对它们进行排序(不必要的)。

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

+0

您好,感谢您的建议。我对存储过程不是很熟悉,但我一定会研究它! :)再次感谢 – James 2010-11-18 08:37:40

+0

不,请使用alex和webbiedave指出的方法。这很容易,只需要确定的时间。 – AndreKR 2010-11-18 11:46:48