【发布时间】:2011-09-18 02:56:22
【问题描述】:
我正在尝试从数据不变的表中获取随机行。我读到有人尝试使用 ORDER BY RAND(),这对于大型数据集来说很糟糕,而且不能很好地扩展。
我还看到了让 SQL 在最小/最大范围之间获取随机行的解决方案,如下所示:FLOOR(MAX(needed_id) * RAND) 但这仅在行是连续的时才有效:1 ,2,3,4,5,6,7,8,9,10。
我需要提取的数据不是连续的,例如:1,2,3,4,10,11,12,13
所以我认为有两种解决方案:
第一种解决方案: 继续运行:FLOOR(MAX(needed_id) * RAND) 直到我收到正确类型的一行(1/6 机会)
第二个解决方案: 像这样创建一个重复的表(因为我的数据永远不会改变):
temp_id | needed_id | type
1 1 1
2 4 1
3 7 2
3 8 2
所以我可以使用以下方法提取随机 temp_id:FLOOR(MAX(temp_id) * RAND) - WHERE type = 1
你怎么看?我可能会运行第一个解决方案大约 6 次,直到我收到正确的行,但在第二个解决方案中它会立即工作,但需要另一个表。
【问题讨论】:
-
大数据集?多少行?
-
mmm 与大多数行相比可能没有那么多行,但应用程序需要快速运行:D 250k 行
标签: php mysql random rows nonsequential