php - MySQL从两个表中使用JOIN选择随机行

标签 php mysql

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

我有 2 个表:

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

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

我要选择的是来自 product_db 的随机图像,其中 status = 'Online' 并且产品必须位于页面 id = 3 中

product_db 有超过 90,000 种产品,product_page 有超过 150,000 行。

我现在使用的查询是:

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))

如果 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

关于php - MySQL从两个表中使用JOIN选择随机行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4209886/

相关文章:

mysql - 是否可以限制一个表在mysql中只有一条记录?

php - MySQL 查询失败?

javascript - 在 PHP 代码中显示/隐藏表格

php - 尝试 SQL 查询,并在成功时返回文本

php - 为什么支付网关使用校验和?

mysql - 操作数应包含 1 列 select 时出现 mysql 错误

php - MYSQL 查询 - 我的大脑爆炸了

Mysql 获取刚刚插入的行

php - 通过 OAuth 将 Google 联系人导入到 PHP 中的 Mysql

mysql - WordPress MySql 不兼容。本地开发的版本 : 5. 6.17 和托管提供商版本 5.5.36