如何加速mysql(innodb)插入?

798qvoo8  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(659)

我有很多文件需要解析并插入到表中。这张table有问题:

这个文件是20.4mb,有81963行。有更大的文件(最多40.xmb)。下面是我要做的:

self.ingester.cursor.execute('''
insert into microsoft_products (bigid_sku, md5_hexdigest, content_type, locale)
values (\'{}\', \'{}\', \'{}\', \'{}\')
'''.format(BigId_Sku, md5_hexdigest, content_type, locale))

以下是几行中经过的时间:

line: 6400 | elapsed time: 519.91
line: 6401 | elapsed time: 519.99
line: 6402 | elapsed time: 520.07
line: 6403 | elapsed time: 520.16
line: 6404 | elapsed time: 520.24
line: 6405 | elapsed time: 520.32

在注解掉insert语句之后:

line: 6400 | elapsed time: 0.81
line: 6401 | elapsed time: 0.81
line: 6402 | elapsed time: 0.81
line: 6403 | elapsed time: 0.81
line: 6404 | elapsed time: 0.81
line: 6405 | elapsed time: 0.81

控制流如下所示:

for file in files:
  open file
    for line in file:
      do stuff
      execute insert

commit

我对数据库很幼稚。有没有办法加快速度?

fcy6dtqo

fcy6dtqo1#

根据@frankerz的建议,您可以批量插入。
在文件中循环行时,为批插入生成值。
sql批插入基本上如下所示:

INSERT INTO table (col1, col2) VALUES (r1c1, r1c2), (r2c1, r2c2)...

其中r=行,c=列。
根据一次性插入的数据量,您可能需要增加max \u allowed \u packet全局变量。
数据库插入通常又好又快,所以您的瓶颈是要为每一行执行插入,所以@frankerz建议是+1。

相关问题