Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.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 ORDER BY RAND()?_Mysql - Fatal编程技术网

为什么不使用mysql ORDER BY RAND()?

为什么不使用mysql ORDER BY RAND()?,mysql,Mysql,我看到许多网站说不要使用ORDER BY RAND,例如,我运行了一个测试,我在20k记录表上测试了速度和性能,其中10k记录的用户名=用户名: SELECT username FROM testingspeed WHERE username='username' ORDER BY RAND(); 结果是: Showing rows 0 - 29 (10,000 total, Query took 0.0119 sec). id = 1 select_type = SIMPLE table

我看到许多网站说不要使用ORDER BY RAND,例如,我运行了一个测试,我在20k记录表上测试了速度和性能,其中10k记录的用户名=用户名:

SELECT username FROM testingspeed WHERE username='username' ORDER BY RAND();
结果是:

Showing rows 0 - 29 (10,000 total, Query took 0.0119 sec).
id = 1 
select_type = SIMPLE
table = testingspeed
type = ref
posible_keys = username
key = username
key_len = 32
ref = const
rows = 3225
Extra = Using where; Using index; Using temporary; Using filesort

由于执行查询只需0.0119秒,速度应该很快,为什么人们仍然说不要使用ORDER BY RAND?为什么3225行仅受影响?为什么10000行不受影响?

按兰德排序的问题在于,正如您的解释告诉您的那样,使用临时和使用文件排序。对于每个请求,将创建一个临时表并进行排序。这是一个相当繁重的行动。当您的数据库不处于重载状态时,这可能无关紧要,但会降低很多性能。

请删除where原因,添加10M行,然后重试。它将显示按兰德排序的速度如何慢于替代品。您很少以随机顺序检索大量记录,您通常会这样做:按兰德排序限制10。对这些检索进行测试,并将其与其他解决方案进行比较。我在PHP RAND上进行了搜索,发现了一些参考资料,这些参考资料指定了当您查看大约10万条记录时,服务器速度会下降,在此之前,没有太多投诉,只是建议不要在生产中使用RAND,除非用于较小的查询,例如,从用户中选择用户名,其中gender='male'和location='antarctica'@J-16 SDiZ,性能仍然适合u建议的测试。结果总共是30000,查询花费了0.0296秒,解释显示3000行受到影响。@Ryan,对于我的情况,我需要随机选择在用户配置文件上显示15张朋友的照片,因此有一个WHERE子句,如WHERE username='zac1987,每个用户只能有5000个朋友。U说100K的记录只会出现问题,所以我的5K记录100%不会有问题吗?当你的数据库没有重载时,意味着如果有10K用户在我的网站上活动,数据库会考虑重载吗?所以兰德公司的订单会在那一刻引发问题吗?我可以知道在那一刻会发生什么问题吗?如果我从testingspeed查询SELECT id、COUNT*,说明没有说明使用临时文件,也没有说明使用filesort。因此,如果我使用查询将所有ID保存到一个php数组中,然后php从php数组中随机选择15个ID,它应该可以解决问题,对吗?没错,它以不同的方式解决问题。但与其在每个用户进程的内存中保存完整的数组,不如通过单个进程预计算固定集以交付缓存。很抱歉,我不理解“通过单个进程预计算固定集以交付缓存”这句话,你能详细解释一下吗?你实现了一个脚本,比如这个数组包含10000个条目。您选择15个随机ID 10次。然后,您可以将这10个子集保存到磁盘,并将它们随机交付给您的最终用户。