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

Python 如何使用多处理有效地将数据从一个数据库表插入到另一个数据库表?,python,multithreading,multiprocessing,Python,Multithreading,Multiprocessing,我在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])

我在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)
import multiprocessing as mp

def jobsFunction(values):
    # jobs function code

if __name__ == '__main__':
    # values fetching
    lock = mp.Lock()
    p = mp.Pool()
    p.map(jobsFunction, values)
    p.close()
    p.join()
问题是完成整个过程需要12个多小时。 因此,我决定使用
multiprocessing.Pool
完成该过程,代码如下:

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)
import multiprocessing as mp

def jobsFunction(values):
    # jobs function code

if __name__ == '__main__':
    # values fetching
    lock = mp.Lock()
    p = mp.Pool()
    p.map(jobsFunction, values)
    p.close()
    p.join()
但在这种情况下,从主函数到作业函数的数据流不符合顺序

我的问题是:我使用的方法是否符合我的要求
如何使用多处理或多线程有效地实现我的需求?

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

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

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

对数据库进行了优化,以复制周围的数据。这些查询将运行得非常快,尤其是当您正确设置了索引时

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


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

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

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

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

对数据库进行了优化,以复制周围的数据。这些查询将运行得非常快,尤其是当您正确设置了索引时

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


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

无序的结果只是并发处理的副作用(无论是使用多线程还是多处理)。因为这很重要,所以您需要自己序列化数据库更新。请注意,执行多处理的方式只是将单个
传递给
作业函数
,而不是它们的列表-因此函数中的代码需要改变上面显示的方式以适应此情况。这也意味着它将创建总共500k个子进程,这将涉及大量开销,因此可能比不使用子进程慢。这是一个错误。更新了问题。立即检查您的编辑未对代码进行任何更改,因此我以前的注释仍然适用。无序的结果只是并发处理的副作用(无论是使用多线程还是多处理)。因为这很重要,所以您需要以某种方式序列化数据库更新。请注意,您执行多处理的方式只是将一个
传递给
作业函数
,而不是它们的列表-因此函数中的代码需要改变上面显示的方式以适应此情况。这还意味着它将创建总共500k个子进程,这将涉及大量开销,因此可能比不使用它慢。这是一个错误。更新了问题。立即检查您的编辑未对代码进行任何更改,因此我以前的注释仍然适用。我不想使用此选项。因为table_name。因此,我在table 2、table 3中为
table_name
中的每个主键插入多行数据,那么您的代码将变慢。500K查询,其中每个查询耗时100ms=50000秒=13小时。@DineshKumar您如何知道有多少个值?总是5行?然后重复
插入…选择…
5次s、 即使对于500K行,这也只需要几秒钟。对于
表名称
中的每个主键,都有多行作为其他表的外键。因此,我必须将结果查询中的所有行插入表1、表2和表3。对于
表名称
中的每个id,我在表1和表2中插入最多10到15行n对于循环,是什么阻止您发送10到15个查询,这些查询创建了一个循环中的所有行,而不是一百万个查询?我不想使用这个。因为
table_name
中的每个主键都有多个值。因此,我在表2、表3中为
table_name
中的每个主键插入了多行数据,然后是您的code将很慢。500K查询,其中每个查询需要100ms=50000秒=13小时。@DineshKumar如何知道有多少个值?总是5?然后重复
插入到…选择…
五次。即使对于500K行,也应该只需要几秒钟。对于
表\u name
中的每个主键,都有多行作为外键因此,我必须将结果查询中的所有行插入表1、表2和表3。在我的例子中,对于
table\u name
中的每个id,我将在循环中插入多达10到15行的表1和表2中。是什么阻止您发送10到15个查询,这些查询在循环中创建所有行,而不是一百万个查询?