Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL与PHP在检索随机项时的比较_Php_Mysql - Fatal编程技术网

MySQL与PHP在检索随机项时的比较

MySQL与PHP在检索随机项时的比较,php,mysql,Php,Mysql,在管理超过10万条记录时,哪一项更有效: A.Mysql 当然,在那之后,我已经拥有了该记录中的所有字段 B.PHP 使用memcached让$cache\u数组将从用户订单中选择id\u用户的所有数据按id\u用户保存1小时左右。。。然后: $id=array\u rand$cache\u array 当然,在此之后,我必须使用以下命令调用MYSQL: SELECT * FROM user WHERE id_user = $id; 所以。。。哪个更有效?A或B?第一个速度非常慢,因为 MyS

在管理超过10万条记录时,哪一项更有效:

A.Mysql

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

B.PHP

使用memcached让$cache\u数组将从用户订单中选择id\u用户的所有数据按id\u用户保存1小时左右。。。然后:

$id=array\u rand$cache\u array

当然,在此之后,我必须使用以下命令调用MYSQL:

SELECT * FROM user WHERE id_user = $id;

所以。。。哪个更有效?A或B?

第一个速度非常慢,因为

MySQL使用 所有结果行,并分配每个结果行 其中一个是随机排序索引。 然后,对结果进行排序和排序 返回


详细说明。

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

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

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

我将给您第三个选项,它可能优于您的两个建议:选择用户表中行的countuser\u id,然后让php生成一个介于0和countuser\u id减去1(包括1)之间的随机数。然后执行由php;生成的SELECT*FROM user LIMIT 1 OFFSET随机数


同样,回答这类问题的正确方法是基准测试。其他一切都是猜测。

replicate:@OMG Ponies:很相似,但不是傻瓜。他不是在问在Mysql中实现它的最佳方法,他是在问两种方法的比较。根据这张图,见末尾的链接,~100K按兰德排序是次秒。我很好奇PHP(更不用说.NET)或J2EE是否会提供类似的性能:这将非常有效,只是我忘了指定可以选择的记录必须使用WHERE flg_pic=1进行过滤。如果我使用countid\u用户,则flg\u pic=0的记录也将被考虑:s@andufo:这根本不是问题。您可以从用户中选择COUNTuser\u id,其中flg\u pic=1;然后选择*FROM user,其中flg_pic=1 LIMIT 1 OFFSET随机数由php生成@亚萨哇。。。以下是150k记录的结果:偏移量用了0.0017秒,按兰特计算用了1.6337秒-谢谢@本贾姆:你错了。此方法适用于非连续id,因为它使用偏移量选择随机行,而不是特定id。@asah,看来您是正确的,谢谢您的启发。我一定读得太快了。
$random_no = mt_rand(0, $total_record_count);

$query = "SELECT * FROM user ORDER BY __KEY__ LIMIT {$random_no}, 1";
$random_no = mt_rand(0, $total_record_count);

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