在MySQL中获得满足给定条件的x随机行的优化方法

时间:2011-02-14 15:25:49

标签: sql mysql random sql-order-by query-performance

我需要从数据库表中获取满足某些给定条件的x行。 我知道我们可以使用ORDER BY RAND()从MySQL获取随机行。

SELECT * FROM 'vids' WHERE 'cat'=n ORDER BY RAND() LIMIT x

我正在寻找最优化的方法做同样的事情{系统资源的低使用率是主要优先事项。下一个重要的优先事项是查询的速度}。另外,在表格设计中,我应该制作'cat'INDEX吗?

2 个答案:

答案 0 :(得分:0)

我正在考虑如何做到这一点。我现在的想法是以下三种选择:

1)选择忽略条件的随机行,然后丢弃在应用程序级别不匹配的行,并根据需要选择更多随机行。如果您的条件与表中的大量行匹配,此方法将有效,可能为20%或更多(需要进行基准测试)

2)选择符合条件的行,并根据1和count(*)之间的随机数选择一行(在应用程序中确定的随机数)。如果符合条件的数据均匀分布,这将是有效的,但如果您选择日期范围,则会非常失败,并且大多数随机数将落在此范围之外的记录上。

3)我目前最喜欢的,也是最多的工作。对于您打算用于选择随机记录的每个标准组合,您可以将记录插入该条件的特殊表中。然后,您可以从特殊表中选择随机记录,然后将它们追溯到您的数据。例如,您可能有一个这样的表:

表格猫:名称,年龄,eye_colour,fur_type

如果你想能够选择棕色皮毛的随机猫,那么你需要一个这样的表:

表cats_with_brown_fur:id(自动编号),cat_fk

然后,您可以根据自动编号ID从此表中选择一个随机记录,它将很快,并将产生均匀分布的随机结果。但实际上,如果您从许多标准集中进行选择,那么维护这些表将会有一些开销。

无论如何,这是我目前的看法。祝你好运

答案 1 :(得分:-3)