首页 > 解决方案 > 如何使用 pandas 数据框有效地更新 mysql 表?

问题描述

我正在使用 Airflow PythonOperator 进行 ETL 以更新 SCD1 维度表 ( dim_user)。

mysql维表的结构:

| user_key | open_id             | gender | nickname | mobile      | load_time           | updated_at          |
|----------|---------------------|--------|----------|-------------|---------------------|---------------------|
| 117      | ohwv90JTgZSn******* | 2      | ABC      | ************| 2019-05-24 10:12:44 | 2019-05-23 19:00:43 |

在 python 脚本中,我有一个相同的结构(除了 user_key 和 load_time 列) pandas dataframe df_users_updated

现在我想在open_id字段匹配的条件下更新 mysql 表:

# database connection
conn = create_engine(db_conn_str)

# update the rows with a for loop
for index, row in df_users_updated.iterrows():
    info = dict(row)
    conn.execute('update dim_user set gender=%s, nickname=%s, mobile=%s, updated_at=%s where open_id=%s',
    (info['gender'], info['nickname'], info['mobile'], info['updated_at'], info['open_id']))
conn.dispose()

问题是我在 df_users_updated 中只有 1000 行,执行这些更新查询需要 10 多分钟。

有一个更好的方法吗?

标签: pythonmysqlpandas

解决方案


根据我的经验,有一些技巧可以提高性能。

  1. 使用mysqlclient库,cursor.executemany(sql, params)方法
  2. 使用tuple参数类型
  3. 在 where 字段上使用索引。

推荐阅读