如何用Python和MariaDB高效生成并插入10亿自定义唯一码?
解决10亿条唯一码快速生成与插入MariaDB的方案
一、重构唯一码生成逻辑,从根源消除冲突开销
目前随机生成后依赖唯一索引去重的方式,在数据量达到1.5亿后冲突概率上升,导致生成时重复检查、插入时索引校验的双重开销。直接改用确定性无冲突生成:
- 先定义字符集与数值的映射表(比如0-9→0-9,A-Z→10-35,a-z→36-61)。
- 用递增序列(数据库自增ID或Python本地生成的连续整数)作为基础,将其转换为对应字符集的10位进制字符串,不足10位补前导零。这种方式生成的码100%唯一,无需任何重复检查,生成速度比随机方式提升数倍。
二、数据库插入优化:放弃executemany,用批量导入工具
executemany在超大规模数据下的效率极低,换用MariaDB原生的LOAD DATA INFILE或mysqlimport,速度能提升50-100倍:
- 多进程并行生成唯一码并写入CSV文件:每个进程负责一个独立的ID区间(比如进程1处理1-1e8,进程2处理1e8+1到2e8),避免进程间冲突,同时利用多核CPU提升生成效率。
- 导入前临时关闭索引与约束:
SET foreign_key_checks = 0; SET unique_checks = 0; ALTER TABLE SN_UNIQUE_CODE DROP INDEX idx_unique_code; -- 先删除唯一索引 - 执行LOAD DATA导入:
LOAD DATA INFILE '/path/to/your/data.csv' INTO TABLE SN_UNIQUE_CODE FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' (unique_code); - 导入完成后恢复索引与约束:
ALTER TABLE SN_UNIQUE_CODE ADD UNIQUE INDEX idx_unique_code(unique_code); SET foreign_key_checks = 1; SET unique_checks = 1;
三、数据库参数调优,适配超大规模插入
调整MariaDB的InnoDB参数,最大化写入性能:
innodb_buffer_pool_size:设为服务器物理内存的70%-80%(比如32G内存设为24G),让数据和索引尽可能缓存到内存。innodb_flush_log_at_trx_commit = 2+sync_binlog = 0:减少磁盘强制同步的开销(如果可以接受极端故障下丢失几秒数据的风险,否则保持默认)。max_allowed_packet = 64M:确保大批次数据传输不会报错。innodb_write_io_threads = 16+innodb_read_io_threads = 16:提升磁盘IO的并发处理能力。innodb_autoinc_lock_mode = 2:如果使用数据库自增ID,提升自增序列的生成效率。
四、分库分表/分区,分散数据压力
10亿条数据单表存储会导致索引过大、写入热点集中,建议拆分:
- 分表:将SN_UNIQUE_CODE拆分为10个表(比如SN_UNIQUE_CODE_0到SN_UNIQUE_CODE_9),根据唯一码的首位字符或哈希值路由,每个表存储1亿条数据。导入时每个进程负责写入一个分表,完全并行无冲突。
- 分区表:按唯一码的范围或哈希值创建分区,插入时数据自动分散到不同分区,索引维护的开销也会被分摊。
内容的提问来源于stack exchange,提问作者here
相关产品推荐
相关产品推荐

