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

时间:2014-11-20 17:13:02

标签: mysql random

我需要获得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

但是现在我有时只得到一排,有时却没有。我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

假设bilder中有100行,但这些行中只有10行geschlecht='female'

第一个查询测试其随机选择100次,每次有5/100的机会选择该行。因此,选择 no 行的几率为0.95 100 (有关为什么看the Birthday Problem的解释),换句话说,只有0.5%的机会不选择任何行。< / p>

第二个查询仅测试其随机选择10次,并且每次仍有5/100的机会选择该行。选择 no 行的几率为0.95 10 ,这是59.87%的几率!

如果将条件应用于count子查询会更好:

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.50 10 ,或小于0.1%。