MST

星途 面试题库

面试题:Python自动化脚本优化数据库操作的性能

在一个高并发的场景下,使用Python连接PostgreSQL数据库进行大量数据的插入操作。现有一百万条数据需要插入到数据库的一张表中,表结构为(id 主键自增, data_text文本类型)。请阐述并实现如何优化这个自动化脚本以提高插入效率,例如批量插入、合理设置数据库连接参数等,并说明优化点的原理。
18.6万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

优化思路及原理

  1. 批量插入
    • 原理:减少数据库连接的交互次数。每次单独插入数据都需要与数据库建立连接、执行SQL语句、关闭连接等操作,这些操作都有一定的开销。批量插入将多条数据一次性发送给数据库执行,大大减少了这种交互开销,从而提高插入效率。
  2. 合理设置数据库连接参数
    • 原理:合适的连接池大小等参数可以避免频繁创建和销毁数据库连接。连接池维护一定数量的数据库连接,程序需要连接时直接从连接池中获取,使用完毕后归还,减少了连接创建和销毁的性能损耗,在高并发场景下尤为重要。

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)


代码说明

  1. 连接池创建:使用psycopg2库的pool.SimpleConnectionPool创建连接池,设置最小连接数为1,最大连接数为20,可以根据实际情况调整。
  2. 插入函数
    • 从连接池获取连接并创建游标。
    • 构建批量插入的SQL语句,使用%s占位符,并将数据整理为合适的格式。
    • 执行SQL语句并提交事务。
    • 无论是否发生异常,最后都将连接归还到连接池。
  3. 主程序:模拟一百万条数据,按批量大小进行分组,调用插入函数实现批量插入。