2013-03-22 37 views
1

使用MySQL或PHP命令返回随机行更好吗?使用MySQL或PHP更好地随机化结果?

例如,我有一个product表有10列和1000000行,并希望返回10个随机行。

  • 方法1(让MySQL的做的大部分工作):

    $query = mysql_query("SELECT * FROM product WHERE product_id in (SELECT product_id FROM product ORDER BY RAND() LIMIT 10)"); 
    while($results[] = mysql_fetch_row($query)); 
    
  • 方法2(让PHP做的大部分工作):

    $query = mysql_query("SELECT * FROM product"); 
    while($results[] = mysql_fetch_row($query)); 
    shuffle($results); 
    $results = array_slice($results, 0, 10); 
    

是方法1或方法2更好?

+0

请考虑http://codereview.stackexchange.com/faq vs http://stackoverflow.com/faq,以便根据“哪个更好”的方式来解决未来的问题。但是,在这种情况下,返回大于您需要的结果集实际上可能会导致PHP中出现memory_limit_exceeded错误,并且在给定足够大的结果集的情况下会导致主要的性能错误(并且如果其中一列是BLOB +,那么它可以快速杀死一个脚本)。如果MySQL不是托管在本地主机上,那么大量并行脚本的网络性能足以让您自己偶然地发生DDOS。 – BrianHall 2013-03-22 18:54:48

+0

自己测试一下吗? – Kermit 2013-03-22 18:56:38

+0

测试自己证明是徒劳的。兰德成为瓶颈。永远不要使用它! – 2013-03-22 19:04:53

回答

4

最好让你的MySQL来完成这项工作,没有必要拉出整个数据库的项目,只丢掉10件事情。

所以你的方法1:

$results = mysql_query("SELECT * FROM product WHERE product_id in (SELECT product_id FROM product ORDER BY RAND() LIMIT 10)"); 

是什么,我会建议使用。

+0

我不会去'RAND' http://net.tutsplus.com/tutorials/other/top-20-mysql-best-practices/阅读第6页 – 2013-03-22 19:01:24

+0

是的,rand是一个瓶颈,但是OP没有'说明一种更有效的方式;刚刚问过这个问题要用哪一个? – 2013-03-22 19:03:57

+0

感谢大家的投入。兰特是MySQL的瓶颈和内存是PHP的问题...我想这没有任何完美的解决方案。我想我可以得到表中的总行数,然后使用php来随机生成查询数据库 – tri 2013-03-22 20:45:01

0

我觉得MySQL的方式更好,因为具有100万项的数组是一个非常巨大的,没有必要在PHP中传递它。