我几天来一直在寻找这个问题的解决方案,找不到任何可以减少运行查询所需的时间.
我有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(它确实减少了所需的时间)但问题是我无法比较产品是否在线"在线" .
这种排序会减慢你的速度.而不是随机排序,只需选择一个随机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)