【发布时间】:2012-10-26 15:49:56
【问题描述】:
Mysql - 我想每小时重新排序一个 100k 行的数据库。我有一个名为“订单”的字段,我按此排序。我怎样才能最好地重新排序?
我目前这样做(伪):
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']
}
但这需要很长时间。
如果我只是执行 'update table set order = rand()' 会有重复,我不希望 order 有重复(但它没有设置为唯一索引,因为它正在那里更新将是重复的。
最好的方法是什么?
(我这样做是因为只执行“select * from table order by rand() limit 100”真的很慢,但是将它放在索引上要快得多。重新排序只需要很长时间)
(mysql 5)
【问题讨论】:
-
一个问题:....为什么?!?!?
-
不要在 PHP 中执行此操作,直接在数据库上执行(如果您必须执行此操作)....如果您必须在 PHP 中执行此操作,请不要循环更新它的每条记录;编写一个可以一次性完成所有操作的更新
-
这几乎肯定是您一开始就不想做的事情。排序是 SELECT 语句的工作,而不是 INSERT 语句。
-
实际上,这是
SELECT和INSERT语句的工作(以及order列上的索引)。不过我同意,您当然不想进行这种手动排序,只需使用索引,这就是它们的用途。 -
您为什么关心
update table set order = rand()生成的重复项?它仍然会完全像没有重复一样随机。你在这里非常努力地射击自己。如果您想保证重复项始终以相同的顺序出现,只需使用select * form table order by "order", "id"。