mysql分块批量插入数据(insert)性能分析

9 篇文章 0 订阅
2 篇文章 0 订阅

一次插入多条数据时,可以使用 insert into table values (v1), (v2) ... (vn) 语句,这样可以避免程序和数据库建立多次连接,从而减少服务器运行时间。

实验设计:

数据库mysql
数据库地址本机
数据总数10万
程序语言Python

数据库设计:

代码:

#encoding=utf8
import pymysql
import string
import random
import time

def get_ran_str():
    return ''.join(random.sample(string.ascii_letters + string.digits, 16))

def get_values_exp(count):
    exp = []
    for i in range(0, count):
        name = get_ran_str()
        key = get_ran_str()
        value = get_ran_str()
        exp.append(f"('{name}', '{key}', '{value}')")
    return ",".join(exp)

if __name__ == '__main__':
    conn = pymysql.connect('localhost', '', '', 'db')
    cursor = conn.cursor()
    arr_count = [1,2,5,10,20,50,100,200,500,1000,2000,5000,10000,20000,50000]
    for count in arr_count:
        sql = "delete from test_insert;"
        cursor.execute(sql)
        sql = 'alter table test_insert auto_increment=1;'
        cursor.execute(sql)
        conn.commit()
        num = 100000
        begin_time = time.time()
        for i in range(0, num//count):
            sql = "insert into test_insert(`name`,`key`,`value`) values " + get_values_exp(count)
            cursor.execute(sql)
            conn.commit()
        end_time = time.time()
        run_time = end_time - begin_time
        print(f'每块{count}条数据的运行时间:{run_time}秒')

实验结果:

每块数据条数运行时间
1625.0080001354218
2324.8550000190735
5146.0849997997284
1085.9079999923706
2053.58800005912781
5032.60899996757507
10025.304999828338623
20021.836999893188477
50017.63699984550476
100011.73800015449524
200014.864000082015991
500014.25499963760376
1000011.13699984550476
2000010.92199969291687
5000010.728999853134155
100000异常

实验分析:

运行时间随块大小的增大先急剧减少,然后趋于稳定

数据分块大小不能无限大,当块大小为10万时,程序就会抛出异常:

使用事务进行插入处理能够提高数据插入效率:

for i in range(0, num//count):
    sql = "insert into test_insert(`name`,`key`,`value`) values " + get_values_exp(count)
    cursor.execute(sql)
conn.commit()

实验结果如下:

每块数据条数运行时间
128.40499997138977
214.674999713897705
510.174000263214111
108.79200005531311
208.255000114440918
507.776000022888184
1007.33899998664856
2007.374999761581421
5007.142000198364258
10007.124000072479248
20007.20799994468689
50007.055999994277954
100007.039999961853027
200007.091000080108643
500007.04800009727478

实验分析:

运行时间随块大小的增大先急剧减少,然后趋于稳定,最后稳定在7s左右

总结:

提示批量插入性能的方法:

1、使用事务管理

2、使用 insert into table values (v1), (v2) ... (vn) 分块批量插入,块大小不宜过小,也不宜过大

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值