Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.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/redis/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
Php 如何最好地每小时重新排序100k个数据库行?_Php_Mysql - Fatal编程技术网

Php 如何最好地每小时重新排序100k个数据库行?

Php 如何最好地每小时重新排序100k个数据库行?,php,mysql,Php,Mysql,Mysql-我想每小时重新排序一个10万行数据库。我有一个名为“order”的字段,我按它排序。我怎样才能最好地重新订购它 我现在做的是: mainpage.php : select * from table order by `order` desc limit 100; 及每小时: cronjob.php : select * from table order by rand(); $i=0; foreach($row) { $i++; update table set order =

Mysql-我想每小时重新排序一个10万行数据库。我有一个名为“order”的字段,我按它排序。我怎样才能最好地重新订购它

我现在做的是:

mainpage.php : select * from table order by `order` desc limit 100;
及每小时:

cronjob.php  : select * from table order by rand(); 
$i=0;
foreach($row) {
$i++;
update table set order = $i where id = $row['id']
}
但这需要时间

如果我只是执行“updatetablesetorder=rand”,则会有重复项,我不希望order有重复项,但不会将其设置为唯一索引,因为在更新时会有重复项

做这件事最好的方法是什么

我这样做是因为仅仅按照rand limit 100从表顺序中选择*非常慢,但在索引中使用它要快得多。重新排序需要很长时间


mysql 5

创建另一个表怎么样?my_wierd_sort_表


然后完全删除它,插入PK和rand列,并将其用于选择中的order by…

为什么不使用自动递增字段,然后生成一个存储在最小值和最大值之间的随机值列表,以便在选择时使用?

MySQL无论如何都不是顺序磁盘存储。这对你没有任何帮助。这样做可能会使行以特定的顺序显示在管理客户机中,但实际上不会增加任何速度。请在select语句中添加ORDERBY子句。

一个问题:……为什么?!?!?不要在PHP中执行此操作,如果必须执行此操作,请直接在数据库中执行。。。。如果你必须用PHP来做,不要循环每个记录来更新它;写一个更新,一次完成所有任务。这几乎肯定是你一开始就不想做的事情。排序是SELECT语句的任务,而不是INSERT语句。实际上,这既是SELECT和INSERT语句的任务,也是列顺序的索引。我同意,不过,你肯定不想做这种手动排序,只是使用索引,这就是它们的用途。为什么你关心更新表set order=rand生成的重复项?它仍然是完全随机的,就像没有重复的一样。你在这里把自己的脚射得很重。如果您想保证副本总是以相同的顺序出现,只需使用select*form table order by order,id。我希望它们随机出现,但必须每小时更改一次顺序,以便看起来站点更新。我使用一个带索引的字段并按该索引排序,因为它比我提出的任何其他方法都要快,所以添加只需将您的ORDER列设置为RAND,您就可以有一个作业在某个时间间隔内更新此列。请不要对表中的行重新排序。那没什么用。我不会对实际的表行重新排序。我每小时将order列设置为一个随机数,然后我就可以从表中按顺序选择*——order字段被索引,因此在每个请求上都比order by rand快,因为我需要显示所有100k,最终我使示例比实际情况简单得多