4

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

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

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

4

2 回答 2

0

我也在努力思考如何做到这一点。我目前的想法是以下三种选择:

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

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

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

桌猫:姓名、年龄、eye_colour、fur_type

如果您希望能够随机选择棕色毛皮的猫,那么您需要这样的表格:

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

然后,您可以根据自动编号 id 从该表中选择一条随机记录,它会很快,并且会产生均匀分布的随机结果。但实际上,如果您从多组标准中进行选择,您将在维护这些表时产生一些开销。

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

于 2012-07-24T16:06:57.357 回答
-3

按 Rand() 排序是个坏主意。

这是一个更好的解决方案: 如何优化 MySQL 的 ORDER BY RAND() 函数?

谷歌是你的朋友,很多人都比我解释得更好。
http://www.titov.net/2005/09/21/do-not-use-order-by-rand-or-how-to-get-random-rows-from-table/ http://www. phpbuilder.com/board/showthread.php?t=10338930 http://www.paperplanes.de/2008/4/24/mysql_nonos_order_by_rand.html

于 2011-06-16T03:37:53.707 回答