gpt4 book ai didi

php - 高性能MySQL随机非连续行

转载 作者:可可西里 更新时间:2023-11-01 07:57:23 26 4
gpt4 key购买 nike

我试图从数据不变的表中随机获取一行。我读到有人尝试使用 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 次,直到收到正确的行,但在第二个解决方案中它会立即运行,但需要另一个表。

最佳答案

你的声明

but this would only work when the rows are sequential:

并不完全正确:floor()max() 示例确实适用于非连续行,因为您会像

WHERE id >= FLOOR(RAND()*MAX(id)) 限制 1

因此,您采用与您获得的随机命中最接近的 ID。

这确实略微偏向于序列中大间隙之后的命中,但这可能还不错,具体取决于您的数据集。

因此,根据您对这种轻微的偏好有多少问题、您的数据集如何等等,这仍然可能是最好的解决方案。

因为有些不清楚,函数的使用没有问题:

MAX 在索引字段上很快。你不需要计算所有的行(在 innoDB 上很慢),你只需要遍历你的 BTREE 索引,所以你会在 log 时间内找到这个值。这几乎是即时的

FLOOR 只是一个将在线性时间内执行的数学函数。就像 RAND 一样。请注意,ORDER BY rand() 并不是因为 rand 而变慢,而是因为您需要对整个表进行排序!这不是兰特的问题,而是秩序的问题。

现在您有一个执行类似操作的查询:

WHERE id >= 48 LIMIT 1

这在索引字段上当然非常快。请记住,您不是通过任何类型的表扫描得到 48(示例)的。

关于php - 高性能MySQL随机非连续行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6401995/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com