效率更高(管理超过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 ?
答案 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)
答案 2 :(得分:0)
$random_no = mt_rand(0, $total_record_count);
$query = "SELECT * FROM user ORDER BY __KEY__ LIMIT {$random_no}, 1";