目录
0 前言
大数据,当然得把数据插入到数据库中,才能进行分析,那么今天我在插入大批量的数据时,遇到了一个性能问题,那就是通过单线程插入3600左右的记录到mysql数据库中,但是速度很慢,那么今天我就介绍几种我自己的观点,关于如何提升批量插入数据性能的解决方案的观点。
1 解决方案1
1.1 在insert语句上做文章
我们可以在插入数据时,不一次插入一条,而是一次插入n条,比如说10条或者20条之类的,但是并不是说一次插入越多,性能就越好,这里有一篇博客,介绍的就是一次插入多少条时性能最优,博客连接。博客中提到,应该是在一次插入10条数据时,性能最优,也就是时间最短。
1.2 我的测试
我在自己电脑做了一个测试,数据库是在阿里云上的数据库,但是延时还是很短,所以网络因素这里可以暂时忽略不计。
1.2.1 一次插入10条数据
这是一次使用insert语句一次插入10条数据时的测试结果,数据大概是3070条左右,这里附上部分代码,也就是我插入数据时的代码,之于对数据做处理的代码,这里暂时不展示。
##################批量插入数据测试
import event
import time
s = time.time()
info = event.Event().compareRealTimeDataWithHistoryData()
print(len(info))
con = 0
if query.check_table_by_name("{}_copy".format("cib1811168_6_2s2019")) is not True:
query.create_realTime_table_copy()
for data in info:
if len(data) == 10:
# con += 1
# pass
if query.insert_into_table_show_rate_10_colums(data) and query.insert_into_realTime_table_copy_10_colums(data):
con += 1
else:
con += 1
for each in data:
each = each.split(",")
query.insert_into_realTime_table_copy(each)
query.insert_into_table_show_rate(each)
else:
for data in info:
if len(data) == 10:
# con += 1
# pass
if query.insert_into_table_show_rate_10_colums(data) and query.insert_into_realTime_table_copy_10_colums(data):
con += 1
else:
con += 1
for each in data:
each = each.split(",")
query.insert_into_realTime_table_copy(each)
query.insert_into_table_show_rate(each)
print(con)
print("time:{}".format(time.time()-s))
1.2.2 一次插入1条数据
从结果中可以看到,相比于1.2.1中的一次插入10条数据相比,这种一次插入一条数据的方式,效率确实很低,想差好多倍(8.6倍左右),这里也附上部分代码,仅供参考。
##################逐条插入数据测试
import event
import time
s = time.time()
info = event.Event().compareRealTimeDataWithHistoryData()
print(len(info))
con = 0
if query.check_table_by_name("{}_copy".format("cib1811168_6_2s2019")) is not True:
query.create_realTime_table_copy()
for data in info:
con += 1
for each in data:
each = each.split(",")
query.insert_into_realTime_table_copy(each)
query.insert_into_table_show_rate(each)
else:
for data in info:
con += 1
for each in data:
each = each.split(",")
query.insert_into_realTime_table_copy(each)
query.insert_into_table_show_rate(each)
print(con)
print("time:{}".format(time.time() - s))
1.3 性能对比
从上面的对比结果中,我们可以看到,使用一次插入10条数据与一次插入1条数据,对于性能的提升很明显,前者较之于后者而言,性能提升了860%,也就是说对于插入同样条数的记录,后者花费的时间是前者的8.6倍。当然,本文还没有对一次插入20条或者30条做测试对比,以后有时间会加上。