TDengine 与 MySQL插入数据的速度对比

注:以下图片均来自我的微信公众号“生锈的TRUENO”,欢迎各位关注!

TDengine的卖点之一就是插入和查询速度要比其他数据库快10倍:

那么,我们今天就拿MySQL和它做一下对比

    对比思路:写两个python脚本,每个脚本都先从CSV文件中读取若干条数据,把这些数据存入一个变量中,然后遍历这个变量,把其中的每一条记录打上时间戳插入MySQL和TDengine,并在数据插入前记录起始时间,在数据插入结束后记录结束时间,对比二者插入数据所需的总时间,以这个时间差来作为数据插入速度的比较标准。

    首先,根据官方文档提示,python3连接TDengine需要先pip安装,具体操作如下:

TDengine 与 MySQL插入数据的速度对比_第1张图片

    ok,安装好后,就可以写python脚本了,我们先来看一下测试MySQL的脚本:


import csv
import pymysql
import datetime
#连接数据库
conn = pymysql.connect(
    host="localhost",
    user="root",
    password="123456",
    database="csvtest",
)
cursor = conn.cursor()
sql=""
#删掉之前的表
try:
    cursor.execute("drop table if exists csv")
except Exception as err:
    conn.close()
    raise(err)
#重新创建表
try:
    cursor.execute('create table if not exists csv (nowtime varchar(100), a varchar(20), b varchar(20), c varchar(20), d varchar(20), e varchar(20), f varchar(20), g varchar(20), h varchar(20))')
except Exception as err:
    conn.close()
    raise(err)
data = []
count=0
#读数据
with open('data_train.csv') as f:
    f_csv = csv.reader(f)
    for row in f_csv:
        count+=1
        if(count>100):#只读100条
            break
        tmp=[]
        tmp.append(datetime.datetime.now())#为每条数据打上时间戳
        for item in row:
            tmp.append(item)
        data.append(tmp)
startTime=datetime.datetime.now()#记录起始时间
#向MySQL中写入数据
for items in data:
    sql="insert into csv(nowtime,a,b,c,d,e,f,g,h) values(%s,%s,%s,%s,%s,%s,%s,%s,%s)"
    cursor.execute(sql,items)
    conn.commit()
    print(items)
endTime=datetime.datetime.now()#记录结束时间
duringtime=endTime-startTime#计算时间差
print("The number of records is:"+str(len(data)))#一共插入多少条记录
print("The total time is:"+str(duringtime.seconds)+"s")#一共用了多少时间
conn.close()

  注:当前仅插入了100条数据,且必须为每条数据打上时间戳,因为TDengine要求每条记录的第一项必须是时间戳:

这样就控制了表单结构这一个无关变量,此外,脚本并没有选择每从CSV文件中读取一条数据就向数据库中插入一条,因为如果这样的话,总时间可能会受从CSV中读取数据的影响,因此,选择了先把数据存起来,然后再向数据库中插入,这样就控制了读取数据这一无关变量。对TDengine的测试脚本也是类似的操作,脚本如下:


import taos
import csv
import datetime
data = []
count=0
#连接数据库
conn=taos.connect(host="127.0.0.1",user="root",password="taosdata",config="/etc/taos")
c1 = conn.cursor()
#使用数据库
try:
    c1.execute('use csvtest')
except Exception as err:
    conn.close()
    raise(err)
#删掉之前的表
try:
    c1.execute("drop table if exists csv")
except Exception as err:
    conn.close()
    raise(err)
#重新创建表
try:
    c1.execute('create table if not exists csv (nowtime timestamp, a binary(20), b binary(20), c binary(20), d binary(20), e binary(20), f binary(20), g binary(20), h binary(20))')
except Exception as err:
    conn.close()
    raise(err)
#读数据
with open('data_train.csv') as f:
    f_csv = csv.reader(f)
    for row in f_csv:
        count+=1
        if(count>100):#只读100条
            break
        tmp=[]
        tmp.append(datetime.datetime.now())#为每条数据打上时间戳
        for item in row:
            tmp.append(item)
        data.append(tmp)
startTime=datetime.datetime.now()#记录起始时间
#向TDengine中写入数据
for items in data:
    c1.execute("insert into csv values('%s','%s','%s','%s','%s','%s','%s','%s','%s',)"%(items[0],items[1],items[2],items[3],items[4],items[5],items[6],items[7],items[8]))
    print(items)
endTime=datetime.datetime.now()#记录结束时间
duringtime=endTime-startTime#计算时间差
print("The number of records is:"+str(len(data)))#一共插入多少条记录
print("The total time is:"+str(duringtime.seconds)+"s")#一共用了多少时间
conn.close()

   ok,我们开始测试888888

    首先是MySQL:

TDengine 与 MySQL插入数据的速度对比_第2张图片

TDengine 与 MySQL插入数据的速度对比_第3张图片

可见,总的记录数为100,说明数据全插进去了,用时为:6s

    再来看看TDengine:

TDengine 与 MySQL插入数据的速度对比_第4张图片

TDengine 与 MySQL插入数据的速度对比_第5张图片

可见,总的记录数同样为100,数据都插进去了,但是用时为......0s???这也太快了吧,我试着把读取的记录数调到10000(把代码中的100改成10000就行),再来看看结果:

TDengine 与 MySQL插入数据的速度对比_第6张图片

总记录数为10000,嗯,没错,用时1s......,实在是太快了......

    综上所述,以目前的测试结果来看,TDengine的数据插入速度至少为MySQL的600倍......what???这已经远超过官方给的10x预期了......可以说,这次的速度之战,MySQL完败,至于TDengine插入速度如此之快的原因,还需要进一步分析~

你可能感兴趣的:(TDengine 与 MySQL插入数据的速度对比)