检索随机项时MySQL与PHP

时间:2010-03-31 15:33:34

标签: php mysql

效率更高(管理超过100K的记录时):

:一种。 MySQL的

SELECT * FROM user ORDER BY RAND();

当然,之后我已经拥有该记录中的所有字段。

B中。 PHP

使用memcached让$ cache_array保存“SELECT id_user FROM user ORDER BY id_user”中的所有数据1小时左右......然后:

$ id = array_rand($ cache_array);

当然,之后我必须用:

进行MYSQL调用
SELECT * FROM user WHERE id_user = $id;

所以...哪个更有效率? A B

3 个答案:

答案 0 :(得分:9)

回答这类问题的正确方法是做一个基准测试。每种方式执行快速而脏的实现,然后运行基准测试以确定哪一个更好。

话虽如此,已知ORDER BY RAND()很慢,因为MySQL不可能使用索引。 MySQL基本上会为表中的每一行运行一次RAND()函数,然后根据RAND()返回的内容对行进行排序。

如果memcached的开销证明小于全表扫描的成本,那么将所有user_id存储在memcached中然后从数组中选择随机元素的另一个想法可能会更好。如果您的数据集很大或过时是一个问题,您可能会遇到问题。此外,您还为应用程序添加了一些复杂性。我会尝试寻找另一种方式。

我会给你第三个选项,它可能会超出你的建议:在你的用户表中选择一行count(user_id)然后让php生成一个介于0和{{1}之间的随机数}减1,包括在内。然后执行count(user_id)

同样,回答这些类型问题的正确方法是进行基准测试。其他任何事情都是猜测。

答案 1 :(得分:4)

第一个是非常缓慢的,因为

  

MySQL创建一个临时表   所有结果行并分配每个   其中一个是随机排序索引。   然后对结果进行排序   返回。

详细阐述了this blog post

答案 2 :(得分:0)

$random_no = mt_rand(0, $total_record_count);

$query = "SELECT * FROM user ORDER BY __KEY__ LIMIT {$random_no}, 1";