You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 06:05:23