我几天来一直在寻找这个问题的解决方案,找不到任何可以减少运行查询所需的时间。
我有两张桌子:
"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(它确实减少了所需的时间)但问题是我无法比较产品是否在线“在线”
答案 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
,然后尝试获取该产品,直到获得该产品。您可以对尝试进行限制。