gpt4 book ai didi

mysql - 优化慢速 ORDER BY RAND() 查询

转载 作者:行者123 更新时间:2023-11-29 04:23:32 26 4
gpt4 key购买 nike

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

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

表 1 - 产品

product_id - pk auto-inc
name
description

数据

1 - product 1 - description
2 - product 2 - description

表 2 - 产品图片

image_id   - pk auto-inc
product_id - fk index
filename

数据

1 - 1 - product 1 image
2 - 1 - product 1 image
3 - 1 - product 1 image
4 - 2 - product 2 image

...

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

最佳答案

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()很多 .


现在,为每个随机产品获取随机图像:

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 by rand()。

关于mysql - 优化慢速 ORDER BY RAND() 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16777688/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com