【发布时间】:2016-09-07 21:25:58
【问题描述】:
如果这个话题已经完成到死,我深表歉意,但我正在努力从一个大型 MySQL 表中选择一个随机行。这是一个名为photos 的表,它的主键是PhotoID。目前它的 ID 范围从 ~1500(由于在测试中创建然后删除的行)到 ~12000,有一些差距,我预计它会变得更大。
虽然我一直在使用它相对较小:
SELECT PhotoID FROM photos
...放入一个PHP数组$All_IDs,然后在PHP中:
$RandomID = $All_IDs[mt_rand(0,count($All_IDs)-1)]
然后:
SELECT /* other columns */ FROM photos WHERE PhotoID = $RandomID
这很好用,当我重复它时,我会得到很多随机照片。但是,我认为加载整个 PhotoID 列以选择一个随机 ID,然后再进行另一个查询以获取该记录的效率不会很高,特别是如果我要选择几个。同样,我宁愿不选择整个表(所有列)到一个数组中只是为了挑选一个。在其他一些 StackOverflow 答案的帮助下,我得出了以下结论:
SELECT MIN(PhotoID) INTO @MinID FROM photos;
SELECT MAX(PhotoID) INTO @MaxID FROM photos;
SELECT PhotoID,/* other columns */ FROM photos WHERE PhotoID >= (@MinID + RAND() * (@MaxID - @MinID)) ORDER BY PhotoID LIMIT 0,1
我认为这会起作用,但我发现重复此查询几次只会给我一小段 ID,在 1500 - 1700 范围内,而如上所述,ID 当前接近 12,000。我不明白这是为什么?
【问题讨论】: