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
嗨,我只是尝试这样的查询并返回一个错误: – James 2010-11-17 23:12:51
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
#1111 - 组函数的使用无效 我错过了什么吗? – James 2010-11-17 23:14:06