Ale*_*lex 2 php mysql scripting
我正在尝试创建php脚本,按顺序生成11,000,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++;
}
Run Code Online (Sandbox Code Playgroud)
}
如果您创建下表:
CREATE TABLE sequence (
sequence_id BIGINT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`sequence_id`)
)
Run Code Online (Sandbox Code Playgroud)
然后一个接一个地发出这三个查询:
INSERT INTO sequence () VALUES ();
DELETE FROM sequence WHERE sequence_id < LAST_INSERT_ID();
SELECT LAST_INSERT_ID() AS sequence;
Run Code Online (Sandbox Code Playgroud)
保证第三个查询返回唯一的序列号.即使您有数十个不同的客户端程序连接到您的数据库,此保证仍然有效.这就是AUTO_INCREMENT的美妙之处.
您可以使用这些SQL查询在需要时获取唯一的序列号,而不是仅预先生成11,000个这些序列号.
如果您必须在1200万序列处回转,则可以使用这些查询.
INSERT INTO sequence () VALUES ();
DELETE FROM sequence WHERE sequence_id < LAST_INSERT_ID();
SELECT LAST_INSERT_ID() MOD 12000000 AS sequence;
Run Code Online (Sandbox Code Playgroud)
这里的技巧是使用自动增量序列号来表示唯一性,但也要删除表中的行,这样它就不会占用大量空间.
请注意,您还可以将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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
321 次 |
| 最近记录: |