上一篇
想象一下这个场景:你刚接手一个新项目,老板甩过来一个Excel表格,轻描淡写地说:"这里大概50万条用户数据,今天下班前导入系统吧。" 😱 你尝试用常规的单条INSERT语句,结果发现——程序跑了一个小时才导入1万条,照这速度,今晚别想回家了!
别慌!掌握批量导入技巧,让你从"加班狗"变身"效率王",下面这些方法,能让你的数据导入速度提升几十倍甚至上百倍!
-- 普通单条插入(龟速) INSERT INTO users (name, age) VALUES ('张三', 25); INSERT INTO users (name, age) VALUES ('李四', 30); ... -- 批量插入(火箭速度) INSERT INTO users (name, age) VALUES ('张三', 25), ('李四', 30), ('王五', 28), ...; -- 一次可插入上千条
💡 优化要点:
LOAD DATA INFILE '/path/to/users.csv' INTO TABLE users FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 ROWS; -- 跳过CSV标题行
🔥 优势:
⚠️ 注意:
# Python示例(其他语言逻辑类似) import psycopg2 conn = psycopg2.connect("your_connection_string") cursor = conn.cursor() try: conn.autocommit = False # 关闭自动提交 for i in range(0, len(data), 1000): # 每1000条提交一次 batch = data[i:i+1000] cursor.executemany("INSERT INTO users VALUES (%s, %s)", batch) conn.commit() # 分批提交 except Exception as e: conn.rollback() # 出错回滚 finally: conn.close()
🎯 为什么有效:
-- 导入前 ALTER TABLE users DISABLE KEYS; -- MySQL ALTER TABLE users DROP INDEX idx_name; -- 其他数据库可能需要直接删除 -- 导入数据... -- 导入后 ALTER TABLE users ENABLE KEYS; -- MySQL CREATE INDEX idx_name ON users(name); -- 重建索引
⚠️ 危险操作警告:
// Java并行批处理示例 ExecutorService executor = Executors.newFixedThreadPool(8); // 8个线程 List<Future<Integer>> futures = new ArrayList<>(); for (List<Record> batch : splitBatches(data, 5000)) { futures.add(executor.submit(() -> { try (Connection conn = getConnection()) { // 执行批量插入 return batchInsert(conn, batch); } })); } // 等待所有任务完成 for (Future<Integer> f : futures) { f.get(); }
💻 配置建议:
方法 | 10万条数据耗时 | 备注 |
---|---|---|
单条INSERT | 52分钟 | 绝对不要用! |
批量INSERT(1000/批) | 28秒 | 简单有效 |
LOAD DATA INFILE | 4秒 | 需要文件权限 |
并行导入(8线程) | 6秒 | 编程复杂度高 |
测试环境:MySQL 8.3,AWS r5.xlarge实例,NVMe SSD存储
预处理语句(Prepared Statements)
调整缓冲区大小
# my.cnf 优化项 bulk_insert_buffer_size = 256M max_allowed_packet = 64M
使用COPY命令(PostgreSQL专属)
COPY users FROM '/data/users.csv' WITH CSV HEADER;
临时关闭binlog(主从架构慎用)
SET sql_log_bin = 0; -- 执行导入... SET sql_log_bin = 1;
Q:为什么我的批量导入还是慢?
A:检查这些点:
Q:导入时数据库其他查询变卡怎么办?
A:尝试:
Q:导入中途失败如何恢复?
A:最佳实践:
没有银弹!最佳方案取决于你的具体数据库类型、数据特征和硬件配置,去让那些海量数据见识你的厉害吧!💪
本文方法适用于MySQL/PostgreSQL/Oracle等主流数据库,具体语法请参考各数据库2025年最新文档。
本文由 裘淑哲 于2025-08-03发表在【云服务器提供商】,文中图片由(裘淑哲)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/524405.html
发表评论