我需要从数据库表中获取满足某些给定条件的x行。 我知道我们可以使用ORDER BY RAND()从MySQL获取随机行。
SELECT * FROM 'vids' WHERE 'cat'=n ORDER BY RAND() LIMIT x
我正在寻找最优化的方法做同样的事情{系统资源的低使用率是主要优先事项。下一个重要的优先事项是查询的速度}。另外,在表格设计中,我应该制作'cat'INDEX吗?
答案 0 :(得分:0)
我正在考虑如何做到这一点。我现在的想法是以下三种选择:
1)选择忽略条件的随机行,然后丢弃在应用程序级别不匹配的行,并根据需要选择更多随机行。如果您的条件与表中的大量行匹配,此方法将有效,可能为20%或更多(需要进行基准测试)
2)选择符合条件的行,并根据1和count(*)之间的随机数选择一行(在应用程序中确定的随机数)。如果符合条件的数据均匀分布,这将是有效的,但如果您选择日期范围,则会非常失败,并且大多数随机数将落在此范围之外的记录上。
3)我目前最喜欢的,也是最多的工作。对于您打算用于选择随机记录的每个标准组合,您可以将记录插入该条件的特殊表中。然后,您可以从特殊表中选择随机记录,然后将它们追溯到您的数据。例如,您可能有一个这样的表:表格猫:名称,年龄,eye_colour,fur_type
如果你想能够选择棕色皮毛的随机猫,那么你需要一个这样的表:
表cats_with_brown_fur:id(自动编号),cat_fk
然后,您可以根据自动编号ID从此表中选择一个随机记录,它将很快,并将产生均匀分布的随机结果。但实际上,如果您从许多标准集中进行选择,那么维护这些表将会有一些开销。
无论如何,这是我目前的看法。祝你好运
答案 1 :(得分:-3)
兰德()的订单是一个坏主意。
这是一个更好的解决方案: How can i optimize MySQL's ORDER BY RAND() function?
谷歌是你的朋友,很多人都会比以往更好地解释它 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