influxdb mysql对比_InfluxDB和MySQL的读写对比测试

今天进行了InfluxDB和MySQL的读写对比测试,这里记录下结果,也方便我以后查阅。

操作系统: CentOS6.5_x64

InfluxDB版本 : v1.1.0

MySQL版本:v5.1.73

CPU : Intel(R) Core(TM) i5-2320 CPU @ 3.00GHz

内存 :12G

硬盘 :SSD

一、MySQL读写测试

测试准备

初始化SQL语句:

CREATE DATABASEtestMysql;CREATE TABLE`monitorStatus` (

`system_name`VARCHAR(20) NOT NULL,

`site_name`VARCHAR(50) NOT NULL,

`equipment_name`VARCHAR(50) NOT NULL,

`current_value`DOUBLE NOT NULL,

`timestamp` BIGINT(20) NULL DEFAULT NULL,INDEX`system_name` (`system_name`),INDEX`site_name` (`site_name`),INDEX`equipment_name` (`equipment_name`),INDEX `timestamp` (`timestamp`)

)

ENGINE=InnoDB;

单写测试代码(insertTest1.c):

ba31005919fc7dc98ea9f3be1127089b.gif

#include #include#include#include"mysql/mysql.h"

#define N 100

intmain() { MYSQL*conn_ptr;intres;intt,i,j;

int64_t tstamp= 1486872962;

srand(time(NULL));

t=0;

conn_ptr=mysql_init(NULL);if (!conn_ptr)

{

printf("mysql_init failed\n");returnEXIT_FAILURE;

}

conn_ptr= mysql_real_connect(conn_ptr,"localhost","root","","testMysql",0,NULL,0);if(conn_ptr)

{for(i=1;i<= 10000;i++)

{

mysql_query(conn_ptr,"begin");for(j=0;j

{char query[1024]={0};

sprintf(query,"insert into monitorStatus values ('sys_%d','s_%d','e_%d','0.%02d','%lld');",//j%10,(t+i)%10,(t+j)%10,(t+i+j)%100,tstamp);

j%10,(t+i)%10,(t+j)%10,rand()%100,tstamp);//printf("query : %s\n",query);

res =mysql_query(conn_ptr,query);if (!res)

{//printf("Inserted %lu rows\n",(unsigned long)mysql_affected_rows(conn_ptr));

}else{

fprintf(stderr,"Insert error %d: %sn",mysql_errno(conn_ptr),mysql_error(conn_ptr));

}if(j%10 == 0) tstamp+=1;

}

mysql_query(conn_ptr,"commit");//printf("i=%d\n",i);

}

}else{

printf("Connection failed\n");

}

mysql_close(conn_ptr);returnEXIT_SUCCESS;

}

View Code

可根据情况调整测试代码中的N参数。

单读测试代码(queryTest1.c):

ba31005919fc7dc98ea9f3be1127089b.gif

#include #include#include"mysql/mysql.h"

intmain()

{

MYSQL*conn_ptr;

MYSQL_RES*res_ptr;

MYSQL_ROW sqlrow;

MYSQL_FIELD*fd;intres, i, j;

conn_ptr=mysql_init(NULL);if (!conn_ptr)

{returnEXIT_FAILURE;

}

conn_ptr= mysql_real_connect(conn_ptr,"localhost","root","","testMysql", 0, NULL, 0);if(conn_ptr)

{

res= mysql_query(conn_ptr,"select * from `monitorStatus` where system_name='sys_8' and site_name='s_9' and equipment_name='e_6' order by timestamp desc limit 10000;");if(res)

{

printf("SELECT error:%s\n",mysql_error(conn_ptr));

}else{

res_ptr=mysql_store_result(conn_ptr);if(res_ptr)

{

printf("%lu Rows\n",(unsigned long)mysql_num_rows(res_ptr));

j=mysql_num_fields(res_ptr);while((sqlrow =mysql_fetch_row(res_ptr)))

{continue;for(i = 0; i < j; i++)

printf("%s\t", sqlrow[i]);

printf("\n");

}if(mysql_errno(conn_ptr))

{

fprintf(stderr,"Retrive error:s\n",mysql_error(conn_ptr));

}

}

mysql_free_result(res_ptr);

}

}else{

printf("Connection failed\n");

}

mysql_close(conn_ptr);returnEXIT_SUCCESS;

}

View Code

Makefile文件:

all:gcc -g insertTest1.c -o insertTest1 -L/usr/lib64/mysql/ -lmysqlclientgcc -g queryTest1.c -o queryTest1 -L/usr/lib64/mysql/ -lmysqlclient

clean:rm -rf insertTest1rm -rf queryTest1

测试数据记录

磁盘空间占用查询:

使用du方式(新数据库,仅为测试):

du -sh /var/lib/mysql

查询特定表:

useinformation_schema;select concat(round(sum(DATA_LENGTH/1024/1024), 2), 'MB') as data from TABLES where table_schema='testMysql' and table_name='monitorStatus';

测试结果:

100万条数据

[root@localhost mysqlTest]# time ./insertTest1

real 1m20.645s

user 0m8.238s

sys 0m5.931s

[root@localhost mysqlTest]#time ./queryTest110000Rows

real 0m0.269s

user 0m0.006s

sys 0m0.002s

原始数据 : 28.6M

du方式 : 279MB

sql查询方式: 57.59MB

写入速度: 12398 / s

读取速度: 37174 / s

1000万条数据

root@localhost mysqlTest]# time ./insertTest1

real 7m15.003s

user 0m48.187s

sys 0m33.885s

[root@localhost mysqlTest]#time ./queryTest110000Rows

real 0m6.592s

user 0m0.005s

sys 0m0.002s

原始数据 : 286M

du方式 : 2.4G

sql查询方式: 572MB

写入速度: 22988 / s

读取速度: 1516 / s

3000万条数据

[root@localhost mysqlTest]# time ./insertTest1

real 20m38.235s

user 2m21.459s

sys 1m40.329s

[root@localhost mysqlTest]#time ./queryTest110000Rows

real 0m4.421s

user 0m0.004s

sys 0m0.004s

原始数据 : 858M

du方式 : 7.1G

sql查询方式: 1714MB

写入速度: 24228 / s

读取速度: 2261 / s

二、InfluxDB读写测试

测试准备

需要将InfluxDB的源码放入 go/src/github.com/influxdata 目录

单写测试代码(write1.go):

ba31005919fc7dc98ea9f3be1127089b.gif

package main

import ("log"

"time"

"fmt"

"math/rand"

"github.com/influxdata/influxdb/client/v2")const(

MyDB= "testInfluxdb"username= "root"password= "") func queryDB(clnt client.Client, cmdstring) (res []client.Result, err error) {

q :=client.Query{

Command:  cmd,

Database: MyDB,

}if response, err := clnt.Query(q); err ==nil {if response.Error() !=nil {returnres, response.Error()

}

res=response.Results

}else{returnres, err

}returnres, nil

}

func writePoints(clnt client.Client,numint) {

sampleSize := 1 * 10000rand.Seed(42)

t :=num

bp, _ :=client.NewBatchPoints(client.BatchPointsConfig{

Database:  MyDB,

Precision:"us",

})for i := 0; i < sampleSize; i++{

t+= 1tags := map[string]string{"system_name": fmt.Sprintf("sys_%d",i%10),"site_name":fmt.Sprintf("s_%d", (t+i) % 10),"equipment_name":fmt.Sprintf("e_%d",t % 10),

}

fields := map[string]interface{}{"value" : fmt.Sprintf("%d",rand.Int()),

}

pt, err := client.NewPoint("monitorStatus", tags, fields,time.Now())if err !=nil {

log.Fatalln("Error:", err)

}

bp.AddPoint(pt)

}

err :=clnt.Write(bp)if err !=nil {

log.Fatal(err)

}//fmt.Printf("%d task done\n",num)

}

func main() {//Make client

c, err :=client.NewHTTPClient(client.HTTPConfig{

Addr:"http://localhost:8086",

Username: username,

Password: password,

})if err !=nil {

log.Fatalln("Error:", err)

}

_, err= queryDB(c, fmt.Sprintf("CREATE DATABASE %s", MyDB))if err !=nil {

log.Fatal(err)

}

i := 1

for i <= 10000{

defer writePoints(c,i)//fmt.Printf("i=%d\n",i)

i += 1}//fmt.Printf("task done : i=%d \n",i)

}

View Code

单读测试代码(query1.go):

ba31005919fc7dc98ea9f3be1127089b.gif

package main

import ("log"

//"time"

"fmt"

//"math/rand"

"github.com/influxdata/influxdb/client/v2")const(

MyDB= "testInfluxdb"username= "root"password= "")

func queryDB(clnt client.Client, cmdstring) (res []client.Result, err error) {

q :=client.Query{

Command: cmd,

Database: MyDB,

}if response, err := clnt.Query(q); err ==nil {if response.Error() !=nil {returnres, response.Error()

}

res=response.Results

}else{returnres, err

}returnres, nil

}

func main() {//Make client

c, err :=client.NewHTTPClient(client.HTTPConfig{

Addr:"http://localhost:8086",

Username: username,

Password: password,

})if err !=nil {

log.Fatalln("Error:", err)

}

q := fmt.Sprintf("select * from monitorStatus where system_name='sys_5' and site_name='s_1' and equipment_name='e_6' order by time desc limit 10000 ;")

res, err2 :=queryDB(c, q)if err2 !=nil {

log.Fatal(err)

}

count := len(res[0].Series[0].Values)

log.Printf("Found a total of %v records\n", count)

}

View Code

测试结果记录

查看整体磁盘空间占用:

du -sh /var/lib/influxdb/

查看最终磁盘空间占用:

du -sh /var/lib/influxdb/data/testInfluxdb

100万条数据

[root@localhost goTest2]# time ./write1

real 0m14.594s

user 0m11.475s

sys 0m0.251s

[root@localhost goTest2]#time ./query12017/02/12 20:00:24 Found a total of 10000records

real 0m0.222s

user 0m0.052s

sys 0m0.009s

原始数据 : 28.6M

整体磁盘占用:27M

最终磁盘占用:21M

写入速度: 68521 / s

读取速度: 45045 / s

1000万条数据

[root@localhost goTest2]# time ./write1

real 2m22.520s

user 1m51.704s

sys 0m2.532s

[root@localhost goTest2]#time ./query12017/02/12 20:05:16 Found a total of 10000records

real 0m0.221s

user 0m0.050s

sys 0m0.003s

原始数据 : 286M

整体磁盘占用:214M

最终磁盘占用:189M 写入速度: 70165 / s

读取速度: 45249 / s

3000万条数据

[root@localhost goTest2]# time ./write1

real 7m19.121s

user 5m49.738s

sys 0m8.189s

[root@localhost goTest2]#lsquery1 query1.go write1 write1.go

[root@localhost goTest2]#time ./query12017/02/12 20:49:40 Found a total of 10000records

real 0m0.233s

user 0m0.050s

sys 0m0.012s

原始数据 : 858M

整体磁盘占用:623M

最终磁盘占用:602M

写入速度: 68318 / s

读取速度: 42918 / s

三、测试结果分析

整体磁盘占用情况对比:

86e9dad5a7fb82ca5781596636d16326.png

最终磁盘占用情况对比:

174c00b252acb4c72fa6ba2cf90ae948.png

写入速度对比:

6809f8c42c8fcd32b83977fa712e672f.png

读取速度对比:

08e06ca461a8ef8a6717201d39b8f67c.png

结论:

相比MySQL来说,InfluxDB在磁盘占用和数据读取方面很占优势,而且随着数据规模的扩大,查询速度没有明显的下降。

针对时序数据来说,InfluxDB有明显的优势。

好,就这些了,希望对你有帮助。

0b1331709591d260c1c78e86d0c51c18.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297399.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Zabbix Maintenance 维护周期

为什么80%的码农都做不了架构师&#xff1f;>>> 概述 你可以定义维护周期在主机或主机组里。这里有2种维护状态&#xff0c;一种是停止对目标的监控数据的收集&#xff0c;一种是继续对目标的监控数据的收集。 当不想收到维护中的服务器的报警时候&#xff0c;需…

女生心中的理想男生!这些条件你符合几条?

1 女生心中的理想男生2 女人购物&男人购物3 好像有点混乱4 哥们和我女朋友整天打打闹闹&#xff0c;真无聊。5 分手吧6 妈妈专属头像-&#xff01;你点的每个赞&#xff0c;我都认真当成了喜欢

mysql 定义XML字段_MyBatis之基于XML的属性与列名映射

上一博客主要是对单表的增删改查&#xff0c;比较简单&#xff0c;而且每个属性与table表的列都是一一对应名字也一样&#xff0c;今天主要学习属性与table表列名不一致的处理&#xff0c;主要有两种一是属性与列名不一致&#xff0c;二是枚举的情况&#xff0c;这里暂时考虑的…

Dapr闪电说 - Dapr落地云原生架构

你认识Dapr么&#xff1f;出自微软&#xff0c;面向社区&#xff0c;开源的云原生工具Dapr已经发布多时了&#xff0c;你了解Dapr的相关知识么&#xff1f;无论你是.NET程序员还是Python &#xff0c;或者Java &#xff0c;还有Go等都可以用Dapr来完成你的云原生场景。本次闪电…

uboot移植9个步骤_不知道具体的新房装修步骤?9个步骤教你吃透装修

最近有同学准备装修新房了&#xff0c;不知道具体的装修步骤是怎么样的&#xff0c;需要花多少预算&#xff1f;装修时间要多久&#xff1f;其实这也不奇怪&#xff0c;很多没有装修经验的朋友对这方面都不太了解的&#xff0c;今天分享一般装修的流程工序&#xff0c;希望能给…

太牛了,原来古人是这样铸造钱币的。。。

全世界只有3.14 % 的人关注了爆炸吧知识古代钱币是怎么做出来的呢&#xff1f;今天与各位说说古钱币的铸造工艺&#xff0c;抛砖引玉让大家更多了解假货的鉴别特点。关于古代钱币铸造工艺的记录文献资料&#xff0c;遗留极少。关于母钱翻砂技术&#xff0c;最早的史料见于明代宋…

渲染终极者 finalRender R3.5 SE for 3ds max/design 2009/2010/2011 32位/64位 汉

中文名: 终级渲染器 渲染终极者 finalRender R3.5 SE for 3ds max/design 2009/2010/2011 32位/64位 顶渲简体中文版 资源格式: 压缩包 版本: R3.5 发行时间: 2010年 制作发行: 原创:cebas VISUAL TECHNOLOGY Inc 中文:顶渲 Ma5 www.toprender.com 地区: 德国 语言: 简体中文,…

java赋值语句_java并发编程之原子性问题

程序是否线程安全&#xff0c;取决于哪些要素呢&#xff0c;主要是以下三个&#xff1a;原子性&#xff0c;可见性&#xff0c;有序性。今天先一起来学习原子性。原子性&#xff1a;我理解一个操作不可再分&#xff0c;即为原子性。而在并发编程的环境中&#xff0c;原子性的含…

“高阶思维”发展意识

1. 前言这个题目不太好交流&#xff0c;因为每个人的认知层面不同&#xff0c;不好达成大多数人趋近相同的看法。这个题目高度抽象化&#xff0c;不谈具体化的内容显得空洞及不容易理解&#xff0c;谈具体化的内容又无法找到着力点。抽象能力本身就是高阶思维的一种体现形式&a…

SQL Server返回当前实例系统日期和时间的函数

下面列举出SQL Server返回实例系统日期和时间的函数&#xff0c;除了ANSI标准函数CURRENT_TIMESTAMP在应用时无需在函数后多加一对空的小括号"()"外&#xff0c;其余均需。 从返回的数据类型"DATETIME2"就可以知道&#xff0c;后面三个函数是SQL Server 20…

培养沙雕要从娃娃抓起

1 培养沙雕要从娃娃抓起▼2 好了好了你们两个可以去洗发店门口上班了▼3 毛绒版俄罗斯方块纵享丝滑▼4 我还以为会有令人期待的被打环节▼5 小蜘蛛你好我是唐僧&#xff0c;请问我可以跟你回盘丝洞吗▼6 吃冰淇淋讲究直接上手▼7 在等奶茶的美团小哥我也想像他一样出门荡…

详解Ubuntu for Android:Thin Client

原文地址&#xff1a;http://blog.csdn.net/ce123/article/details/7291445 详解Ubuntu for Android&#xff1a;Thin Client 一、Ubuntu for Android的定义 在移动终端性能日益强大、多核处理器基本普及的现在&#xff0c;将通用的Ubuntu操作系统与Android系统进行亲密的整合&…

Dapr + .NET 实战(九)本地调试

前几节开发Dapr应用程序时&#xff0c;我们使用 dapr cli 来启动dapr服务&#xff0c;就像这样&#xff1a;dapr run --dapr-http-port 3501 --app-port 5001 --app-id frontend dotnet .\FrontEnd\bin\Debug\net5.0\FrontEnd.dll如果你想要通过dapr调试服务呢&#xff1f;在…

javadoc文档的生成方法_[springboot 开发单体web shop] 4. Swagger生成Javadoc

Swagger生成JavaDoc在日常的工作中&#xff0c;特别是现在前后端分离模式之下&#xff0c;接口的提供造成了我们前后端开发人员的沟通成本大量提升&#xff0c;因为沟通不到位&#xff0c;不及时而造成的[撕币]事件都成了日常工作。特别是很多的开发人员不擅长沟通&#xff0c;…

15个IT技术人员必须思考的问题

行内的人自嘲是程序猿、屌丝和码农&#xff0c;行外的人也经常拿 IT 人调侃&#xff0c;那么究竟是 IT 人没有价值&#xff0c;还是没有仔细思考过自身的价值&#xff1f; 1. 搞 IT 的是屌丝、码农、程序猿&#xff1f; 人们提到 IT 人的时候&#xff0c;总会想到他们呆板、不解…

mysql innodb表损坏_MySQL数据库INNODB表损坏修复处理过程分享

##状况描述突然收到MySQL报警&#xff0c;从库的数据库挂了&#xff0c;一直在不停的重启&#xff0c;打开错误日志&#xff0c;发现有张表坏了。innodb表损坏不能通过repair table 等修复myisam的命令操作。现在记录下解决过程&#xff0c;下次遇到就不会这么手忙脚乱了。处理…

20幅扎心漫画,道尽无数人的人生!30万网友:这简直是在偷窥我生活...

全世界只有3.14 % 的人关注了爆炸吧知识每个人在这世界上都是独特的个体但我们常常在很多方面把生活过得很类似在ins上&#xff0c;名叫Sanesparza的博主就把生活中的各种细节通过漫画的形式表达引来31万网友围观许多人纷纷表示&#xff1a;这不就是我吗&#xff01;太扎心了&a…

多种方法解决Exchange 2010 EMC批量启用邮箱之后出..

平时大家在做Exchange 项目的时候都是需要批量导入AD账户和批量启用AD账户的邮箱,但是有一个比较奇怪的问题是当你使用Exchange 2010 EMC来批量启用邮箱之后会出现乱码问题,并且邮箱用户不能发送和接收电子邮件,那么该如何处理乱码问题呢?不要着急,其实有3种方法可以处理Excha…

matlab菲涅尔衍射_有问必答——SYNOPSYS安装体验课堂——可以设计菲涅尔透镜吗?...

问&#xff1a;SYNOPSYS可以设计菲涅尔透镜吗&#xff1f;答&#xff1a;在USS中有多种菲涅尔面型&#xff0c;用户输入参数即可。问&#xff1a;SYNOPSYS中具有的输入方式&#xff1f;答&#xff1a;大家总是有个误区&#xff0c;以为SYNOPSYS需要输入命令运行&#xff0c;其实…

WeakReference reference quene GC

在了解WeakReference之前,先给出一段简单的代码: public class WeakReferenceTest {public static void main(String[] args) throws Exception {Object o new Object();// 默认的构造函数&#xff0c;会使用ReferenceQueue.NULL 作为queueWeakReference<Object> wr ne…