首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用RAND()查询优化慢顺序

用RAND()查询优化慢顺序
EN

Stack Overflow用户
提问于 2013-05-27 17:09:52
回答 1查看 2.9K关注 0票数 1

我有一个使用ORDER BY RAND()的查询,但是它花费的时间太长,而且随着数据的增长,情况越来越糟。

该查询连接两个表,并返回5个随机产品和每个产品的随机图像。

表1-产品

代码语言:javascript
复制
product_id - pk auto-inc
name 
description

数据

代码语言:javascript
复制
1 - product 1 - description
2 - product 2 - description

表2- ProductImages

代码语言:javascript
复制
image_id   - pk auto-inc
product_id - fk index
filename

数据

代码语言:javascript
复制
1 - 1 - product 1 image
2 - 1 - product 1 image
3 - 1 - product 1 image
4 - 2 - product 2 image

..。

我读过,但是找不到优化查询的方法,所以我请求帮助。提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2013-05-27 17:22:39

ORDER BY RAND()速度慢,因为DBMS必须读取所有行,对所有行进行排序,只需保留几行。因此,此查询的性能在很大程度上取决于表中的行数,并随着行数的增加而下降。

没有办法对其进行优化。

然而,也有其他选择:

您可以通过执行6个查询来实现“获取5个随机行”:

  • 获取表中的行数(可以缓存此行)
  • 使用OFFSET <random offset from 0 to $number_of_rows-1> LIMIT 1执行5次查询(即从一些随机偏移量读取并返回一行) 例如:SELECT * FROM Products OFFSET 42 LIMIT 1 (注意:暂时不加入) 这样的查询非常快,并且在一个与表大小几乎无关的时间内运行。

这应该比ORDER BY RAND()快得多。

现在,要获得每个随机产品的随机图像:

代码语言:javascript
复制
SELECT *
FROM (
    SELECT *
    FROM Products
    OFFSET 42 LIMIT 1
) p
JOIN ProductImages pi
ON   pi.product_id = p.id
ORDER BY RAND()
LIMIT 1

内部查询仍然很快,外部只对少数行进行排序(假设每个产品的图像很少),因此仍然可以使用order ()。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16777688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档