关键在SQL设计、连接管理、数据分批和资源释放:用连接池复用连接,分页读写避免OOM,优化SQL执行计划,慎用异步/多进程。

处理大规模数据库时,Python本身不是瓶颈,关键在SQL设计、连接管理、数据分批和资源释放。下面这些步骤能显著提升性能,避免内存溢出或连接超时。
用连接池复用数据库连接
频繁创建/关闭连接开销大,尤其高并发场景。用SQLAlchemy或psycopg2.pool(PostgreSQL)、pymysql.pool(MySQL)建立连接池,限制最大连接数并自动回收空闲连接。
- 设置
pool_size=10、max_overflow=20,避免连接爆炸 - 查询结束后不手动
close(),交由池管理;长期任务中定期pool.dispose()清理失效连接 - 避免在循环里反复
create_engine——它默认带池,重复调用等于建多个池
分批读写,别一次性load全表
SELECT百万行或INSERT十万条时,全量加载到内存极易OOM。必须按主键或时间字段分页,每次只处理几千行。
- 读取:用
WHERE id BETWEEN ? AND ?或WHERE created_at > ? ORDER BY id LIMIT 5000,配合游标滚动推进 - 写入:用
executemany()批量插入,每批≤1000条;PostgreSQL可用COPY FROM(通过cursor.copy_from()),速度提升5–10倍 - Pandas读大表?用
chunksize=5000参数,迭代DataFrame,别用read_sql(..., chunksize=...)后直接pd.concat()
优化SQL本身,让数据库多干活
90%的慢操作源于低效SQL,不是Python代码。先在数据库客户端验证执行计划(EXPLAIN),再调整。
立即学习“Python免费学习笔记(深入)”;
- 加索引:WHERE、JOIN、ORDER BY涉及的字段组合建复合索引;避免对字段做函数操作(如
WHERE DATE(created_at) = '2024-01-01') - 少用
SELECT *,只取需要字段;关联表太多时考虑提前物化中间结果(临时表或CTE) - UPDATE/DELETE带明确WHERE条件,加LIMIT防误操作;必要时用
RETURNING(PostgreSQL)减少往返
异步+多进程要谨慎选型
纯CPU密集型任务(如清洗后计算)可用multiprocessing;I/O密集型(如多库并行查)可考虑asyncpg(PostgreSQL)或aiomysql,但需重构整个调用链。
- 别用
threading跑数据库操作——CPython的GIL+数据库驱动大多非线程安全,容易死锁或连接错乱 - 多进程注意共享连接对象会报错,每个子进程应独立建连接或用队列传参数,由子进程自己连
- 异步适合高并发轻查询(如API聚合),不适合单次大数据量ETL;上线前压测连接数与事件循环负载
基本上就这些。核心是把压力留在数据库端,让Python当好“调度员”和“管道”,而不是“搬运工”。











