将数千条记录插入表中的最有效方法是什么(MySQL,Python,Django)

Roe*_*ler 11 python mysql sql django insert

我有一个数据库表,其中包含唯一的字符串字段和几个整数字段.字符串字段通常为10-100个字符长.

每分钟左右我都有以下场景:我收到一个与表的记录结构相对应的2-10万个元组的列表,例如

[("hello", 3, 4), ("cat", 5, 3), ...]
Run Code Online (Sandbox Code Playgroud)

我需要将所有这些元组插入到表中(假设我验证这些字符串都不会出现在数据库中).为了澄清,我正在使用InnoDB,并且我有一个自动增量主键用于此表,字符串不是PK.

我的代码当前遍历此列表,因为每个元组都会创建一个具有适当值的Python模块对象,并调用".save()",如下所示:

@transaction.commit_on_success
def save_data_elements(input_list):
    for (s, i1, i2) in input_list:
        entry = DataElement(string=s, number1=i1, number2=i2)
        entry.save()
Run Code Online (Sandbox Code Playgroud)

此代码目前是我系统中的性能瓶颈之一,因此我正在寻找优化它的方法.

例如,我可以生成SQL代码,每个代码包含100个元组的INSERT命令(在SQL中"硬编码")并执行它,但我不知道它是否会改进任何东西.

您有什么建议来优化这样的过程吗?

谢谢

Cha*_*rch 12

对MySQL而言,加载数据的最快方法是使用LOAD DATA INFILE,因此如果您可以将数据转换为期望的格式,那么它可能是将其放入表中的最快方式.


Nad*_*mli 11

您可以使用"field1","field2",..格式将行写入文件,然后使用LOAD DATA加载它们

data = '\n'.join(','.join('"%s"' % field for field in row) for row in data)
f= open('data.txt', 'w')
f.write(data)
f.close()
Run Code Online (Sandbox Code Playgroud)

然后执行:

LOAD DATA INFILE 'data.txt' INTO TABLE db2.my_table;
Run Code Online (Sandbox Code Playgroud)

参考