我有一个使用ORDER BY RAND()的查询,但是它花费的时间太长,而且随着数据的增长,情况越来越糟。
该查询连接两个表,并返回5个随机产品和每个产品的随机图像。
表1-产品
product_id - pk auto-inc
name
description数据
1 - product 1 - description
2 - product 2 - description表2- ProductImages
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..。
我读过这和这,但是找不到优化查询的方法,所以我请求帮助。提前谢谢。
发布于 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()快得多。
现在,要获得每个随机产品的随机图像:
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 ()。
https://stackoverflow.com/questions/16777688
复制相似问题