【发布时间】:2013-12-05 07:52:57
【问题描述】:
我正在尝试创建按顺序生成 11,000,000 百万个唯一 ID 的 php 脚本。但是,我试图在 20 分钟内快速完成它应该生成这 1100 万个唯一 ID。此外,一旦它达到 12,000,000,它应该环绕并从零开始。
这是我目前所拥有的。该脚本一次只会返回一个 id。我刚刚添加了一个循环来查看生成 id 需要多长时间。
while(true){
try {
$this->getAdapter()->query('INSERT INTO generate_ids (assigned_id) SELECT (MAX(assigned_id)+1) FROM generate_ids');
$id = $this->getAdapter()->lastInsertId();
$sql = 'SELECT assigned_id FROM generate_ids WHERE id = $id';
$query = $this->getAdapter()->query($sql);
$result = $query->fetchAll();
//Live system would return id here
$assigned_id = $result[0]['assigned_id'];
} catch (Exception $e) {
//do nothing
}
if($count == 11000000){
die();
}
$count++;
}
}
【问题讨论】:
-
一个好的第一步是不要一次做一行。
-
为什么不直接使用
AUTO_INCREMENT?还有为什么一定要选择刚才生成的ID呢?您不信任创建记录的数据库吗? -
是的,就像@siride 说的那样,一次执行 1 行会导致调用 11,000,000 个查询,这将非常慢……如果每个请求花费 200 毫秒,则运行需要 6,111 小时我相信这个脚本。
-
完全不清楚您要完成什么。将生成的 id 值存储在表中是否重要?看不懂
//Live system would return id here的评论,把id返回到什么进程,怎么返回?您是否需要填充具有 11,000,000 行的表?鉴于您在达到 12,000,000 时指定了一个换行,我们假设 id 也需要是连续的(不仅仅是唯一的)并且 id 的范围应该是 1,000,001 到 12,000,000(或 1,000,000 到 11,999,999)? -
@Joshua Smock:如果每个 SQL 执行平均需要 200 毫秒,那将是大约 1,222 小时。 (每次循环执行两次 SQL(一个 INSERT 和一个 SELECT):22,000,000 次执行 * 200ms = 1,222 小时。