如何使用多重处理将数据从一个数据库表有效地插入到另一个数据库表中?

2024-04-18 23:55:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我在mysql数据库表中有多达500k行的数据,我必须用一些查询处理这些数据,并将结果查询数据插入5个不同的表中。在

我的代码片段如下:

def jobsFunction(values):
    unique_values = []
    ref_value = {}
    for value in values:
        if value not in unique_values:
            unique_values.append(value[0])
            # some select queries with other tables
            # from the result insert into table1
            for query_vals in select_query:
                ref_val[id] = some_val
                # Insert into table2 with query_vals
                # Update table3 with query_vals
        # insert into table4 for each iteration with some process
        # insert into table5 based on ref_val[id]

if __name__ == '__main__':
    query = "SELECT roll_no, user_id, tenant_item_id FROM table_name"
    cursor.execute(query)
    vals = cursor.fetchall()
    values = list(vals)
    jobFunction(values)

问题是完成整个过程需要12个多小时。 所以我决定用multiprocessing.Pool完成这个过程,代码如下:

^{pr2}$

但在本例中,从main函数到jobsFunction的数据流不是按顺序排列的。在

我的问题是:我使用正确的方法来满足我的需求吗 如何使用多处理或多线程有效地实现我的需求?在


Tags: 数据inrefidforvaluewithval
1条回答
网友
1楼 · 发布于 2024-04-18 23:55:30

从数据库中取出数据然后再写回来是很慢的。尽量避免。一些数字:如果每个查询只需要100毫秒,那么执行它们就需要13个小时以上。在

考虑使用这种设计:与其将所有数据传输到Python进行处理,不如使用一系列或SQL查询来完成数据库中的所有工作。因此,与其将数据读入Python列表,不如使用SQL查询,比如

insert into table1 (...)
select ... from table_name

或者

^{pr2}$

数据库被优化以复制数据。这些查询将运行得非常快,特别是当您正确地设置了索引时。在

考虑使用helper表使查询更简单或更高效,因为您可以创建、截断、填充数据,然后为您的案例创建完美的索引。在

只在Python中做真正复杂的事情,并确保它只处理几行。在

相关问题 更多 >