gpt4 book ai didi

MySQL 获取两个随机行(复杂),性能

转载 作者:行者123 更新时间:2023-11-30 22:54:20 24 4
gpt4 key购买 nike

我需要获得 2 个随机行,但不仅仅是使用 rand(),因为它对 10k+ 行的性能非常不利,所以我从这里的另一个问题中得到了这段代码:

SELECT b.*
FROM bilder b CROSS JOIN
(SELECT COUNT(*) as cnt FROM bilder) v
WHERE rand() <= 5 / cnt
ORDER BY rand()
LIMIT 2

所以我从表 bilder 中随机得到 2 行,现在性能好多了。但我需要再详细说明一下。我只需要字段 geschlecht 获得值 female 的行,所以我尝试了:

SELECT b.*
FROM bilder b CROSS JOIN
(SELECT COUNT(*) as cnt FROM bilder) v
WHERE rand() <= 5 / cnt AND geschlecht = 'female'
ORDER BY rand()
LIMIT 2

但现在我有时只得到一行,有时什么也没有。我怎样才能正确地做到这一点?

最佳答案

假设您在 bilder 中有 100 行,但其中只有 10 行具有 geschlecht='female'

第一个查询测试其随机选择 100 次,每次它有 5/100 的机会选择该行。因此,选择 no 行的几率是 0.95100(有关原因的解释,请参阅 the Birthday Problem ),换句话说,只有 0.5% 的机会不选择任何行。

第二个查询只测试了它的随机选择 10 次,每次它仍然有 5/100 的机会选择该行。选择没有行的几率是 0.9510,即 59.87% 的几率!

如果您也将条件应用于计数子查询会更好:

SELECT b.*
FROM bilder b CROSS JOIN
(SELECT COUNT(*) as cnt FROM bilder WHERE geschlect = 'female') v
WHERE rand() <= 5 / cnt AND geschlecht = 'female'
ORDER BY rand()
LIMIT 2

现在 cnt 只有 10,因此随机机会是选择该行的 5/10 机会。因此,未选取任何行的几率为 0.5010,或小于 0.1%。

关于MySQL 获取两个随机行(复杂),性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27045534/

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