高效批量插入数据的最佳方式是使用事务(transaction)和 prepared statement。开启一个事务,然后批量执行INSERT语句,最后提交事务。代码示例:BEGIN TRANSACTION; INSERT INTO table VALUES (?,?); ... ; COMMIT; 这比逐条插入快10-100倍。管理海量信息时,使用索引、VACUUM优化、WAL模式(PRAGMA journal_mode=WAL;),分表或分区存储,避免单表过大(建议单表不超过1亿行)。
使用事务批量插入
SQLite的批量插入关键在于使用事务。不要每次插入都提交,而是: BEGIN; for row in data: db.execute('INSERT INTO t VALUES (?,?)', row) COMMIT; 这样可以将插入速度从每秒几百行提升到每秒几十万行。测试显示,100万条数据,逐条插入需10分钟,使用事务只需几秒。
Prepared Statements优化
使用prepared statement避免SQL解析开销: stmt = db.prepare('INSERT INTO table (col1, col2) VALUES (?, ?)') for row in rows: stmt.bind(1, row[0]) stmt.bind(2, row[1]) stmt.step() stmt.finalize() 这对重复结构的数据特别高效。
WAL模式和PRAGMA设置
PRAGMA journal_mode=WAL; 开启Write-Ahead Logging,大幅提升并发写入性能。PRAGMA synchronous=NORMAL; 减少fsync调用。PRAGMA cache_size=1000000; 增大缓存。对于海量数据,定期执行ANALYZE和VACUUM保持性能。
分批插入避免内存爆炸
海量数据时,分批处理,每批1万-10万条: while data: batch = data[:10000] # 插入batch data = data[10000:] 使用生成器读取大文件,避免一次性加载全部数据到内存。
索引和表设计管理海量信息
合理索引:只在查询字段建索引,避免过度索引拖慢插入。单表行数控制在千万级,使用分区表或多表策略。定期清理:DELETE + VACUUM。使用FTS5扩展做全文搜索管理文本海量信息。
Python sqlite3示例代码
import sqlite3 import time conn = sqlite3.connect('test.db') conn.execute('PRAGMA journal_mode=WAL') start = time.time() conn.execute('BEGIN') for i in range(100000): conn.execute('INSERT INTO t (id, val) VALUES (?, ?)', (i, f'val{i}')) conn.commit() print(time.time() - start) # 通常<1秒
常见问题FAQ
Q: 批量插入时数据库锁定了怎么办?
A: 使用WAL模式支持并发读写,避免独占锁。
Q: 海量数据查询慢怎么优化?
A: 加复合索引,EXPLAIN QUERY PLAN分析查询计划,限制结果集大小。
Q: 内存不足时怎么插入亿级数据?
A: 流式读取,分批事务插入,每批后VACUUM,监控内存使用。
Q: SQLite适合生产海量数据吗?
A: 适合中小规模(TB级),超大规模考虑分库或迁移PostgreSQL。