【发布时间】:2015-02-20 22:36:17
【问题描述】:
如何从至少有 100 万个寄存器的表中随机获取 10 行?我读到了 random() 的顺序,但很多人说它太慢了。在这种情况下我可以使用哪种算法?
【问题讨论】:
标签: mysql random random-sample
如何从至少有 100 万个寄存器的表中随机获取 10 行?我读到了 random() 的顺序,但很多人说它太慢了。在这种情况下我可以使用哪种算法?
【问题讨论】:
标签: mysql random random-sample
ORDER BY RAND() LIMIT n 确实很耗时。但它确实提供了很好的n 不同行的伪随机选择。
你可以试试这个。它仍然需要扫描您的表,但不必进行排序。这不能保证正好十行;它可能产生更多或更少。
SELECT *
FROM (
SELECT a.*
FROM mytable a
JOIN (select COUNT(*) rowcnt, 10 samplecnt from mytable) c
WHERE RAND() <= (CAST(samplecnt AS DOUBLE) )/ CAST(rowcnt AS DOUBLE)
) sample
ORDER BY rand()
它通过使用伪随机数来选择是否将表格的每一行包含在结果集中。
在我有 750K 行的测试表上,ORDER BY RAND() LIMIT 10 方法比 WHERE RAND() <=... 方法慢三倍。
【讨论】:
COUNT(*) 替换为从information_schema 提取的TABLE_ROWS,从而使速度翻了一番。 mysql.rjweb.org/doc.php/…