PHP,MySQL - 结果数组洗牌会比“select ... order by rand()”更快吗?
Posted
技术标签:
【中文标题】PHP,MySQL - 结果数组洗牌会比“select ... order by rand()”更快吗?【英文标题】:PHP, MySQL - would results-array shuffle be quicker than "select... order by rand()"? 【发布时间】:2009-12-12 01:03:47 【问题描述】:我已经阅读了很多关于使用“order by rand”的缺点的文章,所以我不需要对此进行更新。 我在想,因为我只需要从数据库中检索到的有限数量的行进行随机化,也许我应该这样做:
$r = $db->query("select * from table limit 500");
for($i;$i<500;$i++)
$arr[$i]=mysqli_fetch_assoc($r);
shuffle($arr);
(我知道这只会随机化前 500 行)。
会比
更快吗?$r = $db->("select * from table order by rand() limit 500");
让我提一下,假设数据库表包含超过...10,000 行。
你为什么不自己做呢?!? - 嗯,我有,但我正在寻找你有经验的意见。
谢谢!
【问题讨论】:
您想随机化前 500 行的顺序,还是返回 500 随机行?这是一个重要的区别,您的两种解决方案会产生不同的结果! 我明白你在说什么,但无论哪种方式对我都有好处。我只是在寻找解决此问题的最快方法。 最快的方法是检索 500 行然后随机播放。我相信可以在 SQL 中执行此操作(这很可能比 php 解决方案更快),但它需要与您建议的查询不同。 【参考方案1】:500 或 10K,样本量太小,无法得出切实的结论。在 100K 时,您仍在查看 1/2 second region on this graph。如果您仍然关心性能,请查看two options for a randomized number I provided in this answer。
我们没有您的数据或设置,因此您可以实际测试情况。关于如何在 PHP 中计算经过时间的页面有很多 - 创建两个页面,一个使用 shuffle,另一个使用 RAND() 查询。每个运行至少 10 个,然后看看。
【讨论】:
谢谢,在发布这个问题之前,我实际上已经阅读了几次该主题。【参考方案2】:我是根据 MySQL 的经验来看待这个问题的。
我们来说说第一段代码:
$r = $db->query("select * from table");
for($i=0;$i<500;$i++)
$arr[$i] = mysqli_fetch_assoc($r);
shuffle($arr);
显然,限制 SQL 语句中的行数比在 PHP 上进行更有效。
因此:
$r = $db->query("SELECT * FROM table LIMIT 500");
while($arr[] = mysqli_fetch_assoc($r))
shuffle($arr);
SQL 操作会比在 PHP 中更快,尤其是当您有如此大量的行时。找出答案的一种好方法是进行基准测试并找出两者中的哪一个会更快。我敢打赌,SQL 会比 PHP 中的 shuffle 更快。
所以我的投票是:
$r = $db->query("SELECT * FROM table ORDER BY RAND() LIMIT 500");
while($arr[] = mysqli_fetch_assoc($r))
【讨论】:
RAND() 不可扩展.. 一旦你达到数千行,它就会显着减慢。 谢谢!我看到了你提到的那个错误并纠正了它。 嗯,洗牌是 O(n),排序是 O(n log n)。我会说 shuffle 实际上会更快。【参考方案3】:我很确定在您的情况下洗牌需要更长的时间,但您可能希望查看此链接以获取有关数据库中快速随机集的示例。它需要一些额外的 SQL,但如果速度对您很重要,那就这样做吧。
http://devzone.zend.com/article/4571-Fetching-multiple-random-rows-from-a-database
【讨论】:
以上是关于PHP,MySQL - 结果数组洗牌会比“select ... order by rand()”更快吗?的主要内容,如果未能解决你的问题,请参考以下文章