生成11,000,000个唯一ID的最快方法

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)

}

O. *_*nes 5

如果您创建下表:

 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)