我正在尝试创建 php 脚本,它按顺序生成 11,000,000 百万个唯一 ID。但是,我试图在 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++;
}
最佳答案
如果创建下表:
CREATE TABLE sequence (
sequence_id BIGINT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`sequence_id`)
)
然后依次发出这三个查询:
INSERT INTO sequence () VALUES ();
DELETE FROM sequence WHERE sequence_id < LAST_INSERT_ID();
SELECT LAST_INSERT_ID() AS sequence;
第三个查询保证返回一个唯一的序列号。即使您有许多不同的客户端程序连接到您的数据库,此保证仍然有效。这就是 AUTO_INCREMENT 的美妙之处。
您可以在需要时使用这些 SQL 查询来获取唯一的序列号,而不仅仅是预先生成一千一百万个这样的序列号。
如果您必须在序列号 1200 万处环绕,您可以改用这些查询。
INSERT INTO sequence () VALUES ();
DELETE FROM sequence WHERE sequence_id < LAST_INSERT_ID();
SELECT LAST_INSERT_ID() MOD 12000000 AS sequence;
这里的技巧是使用自动递增的序列号来确保唯一性,但同时删除表中的行,以免占用大量空间。
请注意,您还可以将 LAST_INSERT_ID() 的序列号用于其他目的,例如。
INSERT INTO sequence () VALUES ();
DELETE FROM sequence WHERE sequence_id < LAST_INSERT_ID();
INSERT INTO user (userid, username, phone)
VALUES (LAST_INSERT_ID() MOD 12000000, 'Joe', '800-555-1212');
SELECT LAST_INSERT_ID() MOD 12000000 AS sequence;
关于php - 生成 11,000,000 个唯一 ID 的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20110896/