优化思路及原理
- 批量插入:
- 原理:减少数据库连接的交互次数。每次单独插入数据都需要与数据库建立连接、执行SQL语句、关闭连接等操作,这些操作都有一定的开销。批量插入将多条数据一次性发送给数据库执行,大大减少了这种交互开销,从而提高插入效率。
- 合理设置数据库连接参数:
- 原理:合适的连接池大小等参数可以避免频繁创建和销毁数据库连接。连接池维护一定数量的数据库连接,程序需要连接时直接从连接池中获取,使用完毕后归还,减少了连接创建和销毁的性能损耗,在高并发场景下尤为重要。
Python实现代码示例
import psycopg2
from psycopg2 import pool
# 创建连接池
postgreSQL_pool = pool.SimpleConnectionPool(
1, # 最小连接数
20, # 最大连接数
user="your_user",
password="your_password",
host="your_host",
port="your_port",
database="your_database"
)
def insert_data(data_list):
try:
connection = postgreSQL_pool.getconn()
cursor = connection.cursor()
# 批量插入SQL语句
sql = "INSERT INTO your_table_name (data_text) VALUES %s"
values = [(data,) for data in data_list]
cursor.execute(sql % ','.join(['%s'] * len(values)), [item for sublist in values for item in sublist])
connection.commit()
except (Exception, psycopg2.Error) as error:
print("Error while connecting to PostgreSQL", error)
finally:
if connection:
postgreSQL_pool.putconn(connection)
if __name__ == "__main__":
total_data = 1000000
batch_size = 1000
data = [f'data_{i}' for i in range(total_data)]
for i in range(0, total_data, batch_size):
batch_data = data[i:i + batch_size]
insert_data(batch_data)
代码说明
- 连接池创建:使用
psycopg2
库的pool.SimpleConnectionPool
创建连接池,设置最小连接数为1,最大连接数为20,可以根据实际情况调整。
- 插入函数:
- 从连接池获取连接并创建游标。
- 构建批量插入的SQL语句,使用
%s
占位符,并将数据整理为合适的格式。
- 执行SQL语句并提交事务。
- 无论是否发生异常,最后都将连接归还到连接池。
- 主程序:模拟一百万条数据,按批量大小进行分组,调用插入函数实现批量插入。