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 DATABASE testMysql;
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):
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include "mysql/mysql.h" #define N 100 int main()
{
MYSQL *conn_ptr;
int res;
int t,i,j;
int64_t tstamp = ;
srand(time(NULL));
t=;
conn_ptr = mysql_init(NULL);
if (!conn_ptr)
{
printf("mysql_init failed\n");
return EXIT_FAILURE;
}
conn_ptr = mysql_real_connect(conn_ptr,"localhost","root","","testMysql",,NULL,);
if (conn_ptr)
{
for(i=;i<= ;i++)
{
mysql_query(conn_ptr,"begin");
for(j=;j<N;j++,t++)
{
char query[]={}; 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%,(t+i)%,(t+j)%,rand()%,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% == ) tstamp+=;
}
mysql_query(conn_ptr,"commit");
//printf("i=%d\n",i);
}
}
else
{
printf("Connection failed\n");
}
mysql_close(conn_ptr);
return EXIT_SUCCESS;
}
可根据情况调整测试代码中的N参数。
单读测试代码(queryTest1.c):
#include <stdio.h>
#include <stdlib.h>
#include "mysql/mysql.h" int main()
{
MYSQL *conn_ptr;
MYSQL_RES *res_ptr;
MYSQL_ROW sqlrow;
MYSQL_FIELD *fd;
int res, i, j; conn_ptr = mysql_init(NULL);
if (!conn_ptr)
{
return EXIT_FAILURE;
}
conn_ptr = mysql_real_connect(conn_ptr,"localhost","root","","testMysql", , NULL, );
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 = ; 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);
return EXIT_SUCCESS;
}
Makefile文件:
all:
gcc -g insertTest1.c -o insertTest1 -L/usr/lib64/mysql/ -lmysqlclient
gcc -g queryTest1.c -o queryTest1 -L/usr/lib64/mysql/ -lmysqlclient clean:
rm -rf insertTest1
rm -rf queryTest1
测试数据记录
磁盘空间占用查询:
使用du方式(新数据库,仅为测试):
du -sh /var/lib/mysql
查询特定表:
use information_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 ./queryTest1
Rows 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 ./queryTest1
Rows 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 ./queryTest1
Rows 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):
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, cmd string) (res []client.Result, err error) {
q := client.Query{
Command: cmd,
Database: MyDB,
}
if response, err := clnt.Query(q); err == nil {
if response.Error() != nil {
return res, response.Error()
}
res = response.Results
} else {
return res, err
}
return res, nil
} func writePoints(clnt client.Client,num int) {
sampleSize := *
rand.Seed()
t := num
bp, _ := client.NewBatchPoints(client.BatchPointsConfig{
Database: MyDB,
Precision: "us",
}) for i := ; i < sampleSize; i++ {
t +=
tags := map[string]string{
"system_name": fmt.Sprintf("sys_%d",i%),
"site_name":fmt.Sprintf("s_%d", (t+i) % ),
"equipment_name":fmt.Sprintf("e_%d",t % ),
}
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 :=
for i <= {
defer writePoints(c,i)
//fmt.Printf("i=%d\n",i)
i +=
}
//fmt.Printf("task done : i=%d \n",i) }
单读测试代码(query1.go):
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, cmd string) (res []client.Result, err error) {
q := client.Query{
Command: cmd,
Database: MyDB,
}
if response, err := clnt.Query(q); err == nil {
if response.Error() != nil {
return res, response.Error()
}
res = response.Results
} else {
return res, err
}
return res, 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[].Series[].Values)
log.Printf("Found a total of %v records\n", count) }
测试结果记录
查看整体磁盘空间占用:
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 ./query1
// :: Found a total of records 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 ./query1
// :: Found a total of records 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]# ls
query1 query1.go write1 write1.go
[root@localhost goTest2]# time ./query1
// :: Found a total of records real 0m0.233s
user 0m0.050s
sys 0m0.012s原始数据 : 858M
整体磁盘占用:623M
最终磁盘占用:602M
写入速度: 68318 / s
读取速度: 42918 / s
三、测试结果分析
整体磁盘占用情况对比:

最终磁盘占用情况对比:

写入速度对比:

读取速度对比:

结论:
相比MySQL来说,InfluxDB在磁盘占用和数据读取方面很占优势,而且随着数据规模的扩大,查询速度没有明显的下降。
针对时序数据来说,InfluxDB有明显的优势。
好,就这些了,希望对你有帮助。
本文github地址:
https://github.com/mike-zhang/mikeBlogEssays/blob/master/2017/20170212_InfluxDB和MySQL的读写对比测试.md
欢迎补充
InfluxDB和MySQL的读写对比测试的更多相关文章
- MyCAT实现MySQL的读写分离
在MySQL中间件出现之前,对于MySQL主从集群,如果要实现其读写分离,一般是在程序端实现,这样就带来一个问题,即数据库和程序的耦合度太高,如果我数据库的地址发生改变了,那么我程序端也要进行相应的修 ...
- (转)使用Amoeba 实现MySQL DB 读写分离
Amoeba(变形虫)项目是一个开源框架,于2008年开始发布一款 Amoeba for Mysql软件: 这个软件致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的时候充当SQ ...
- 使用Amoeba 实现MySQL DB 读写分离
Amoeba(变形虫)项目是一个开源框架,于2008年开始发布一款 Amoeba for Mysql软件: 这个软件致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的时候充当SQ ...
- Amoeba搞定mysql主从读写分离
前言:一直想找一个工具,能很好的实现mysql主从的读写分离架构,曾经试用过mysql-proxy发现lua用起来很不爽,尤其是不懂lua脚本,突然发现了Amoeba这个项目,试用了下,感觉还不错,写 ...
- Centos7源码安装mysql及读写分离,互为主从
Linux服务器 -源码安装mysql 及读写分离,互为主从 一.环境介绍: Linux版本: CentOS 7 64位 mysq版本: mysql-5.6.26 这是我安装时所使用的版本, ...
- Amoeba实现mysql主从读写分离
Amoeba实现mysql主从读写分离 这段在网上看了下关于amoeba的文章,总体感觉好像要比mysql-proxy好的多,也参考了不少的资料,此文章可能与其他文章作者会有雷同的地方,请谅解,但是此 ...
- Atlas mysql的读写分离和负载均衡<转>
mysql的读写分离和负载均衡 http://my.oschina.net/superbigfu/blog/178134
- python实现mysql的读写分离及负载均衡
Oracle数据库有其公司开发的配套rac来实现负载均衡,目前已知的最大节点数能到128个,但是其带来的维护成本无疑是很高的,并且rac的稳定性也并不是特别理想,尤其是节点很多的时候. 但是,相对my ...
- MySQL ProxySQL读写分离实践
目的 在上一篇文章MySQL ProxySQL读写分离使用初探里初步介绍了ProxySQL的使用,本文继续介绍它的一些特点和DBProxy的性能差异.深入一些去了解ProxySQL,通过测试来说明Pr ...
随机推荐
- [Web 前端 ] 五大WEB主流浏览器及四大内核
现在国内常见的浏览器有:IE.Firefox.Safari.Opera.Google Chome.QQ浏览器.搜狗浏览器.百度浏览器.猎豹浏览器.UC浏览器.360浏览器.遨游浏览器.世界之窗浏览器等 ...
- JAVA垃圾回收机制概要
垃圾回收是JAVA中的一个大知识点,也是一个著名知识点,毕竟JAVA号称自己先进性的时候总是会带上垃圾回收.于是,它也成了面试中的常客,面试官动不动的就要你解释下什么是垃圾回收,以及它的原理是什么.当 ...
- linux 7z 命令编译安装,mac安装p7zip
linux 7z 命令编译安装 7zip是一个开源的压缩软件 7z格式是压缩率最高的格式 服务器备份 数据几个g 要是tar压缩下载的话 时间太长 7zip压缩出来体积很小 首先安装 我这是 ce ...
- RF的特征子集选取策略(spark ml)
支持连续变量和类别变量,类别变量就是某个属性有三个值,a,b,c,需要用Feature Transformers中的vectorindexer处理 上来是一堆参数 setMaxDepth:最大树深度 ...
- CodeReview工具Gerrit的python库pygerrit2
源代码: https://github.com/dpursehouse/pygerrit2
- JavaScript:Number 对象
ylbtech-JavaScript:Number 对象 1. Number 对象返回顶部 Number 对象 Number 对象是原始数值的包装对象. 创建 Number 对象的语法: var my ...
- 我的Visual Studio 2013常用快捷键
声明及广告 所有功能针对C#开发配置而写,部分功能可能由插件提供,我会尽可能标注出相应的插件名称.为行文方便,所有快捷键以大写形式表示.太常用的快捷键,如Ctrl + C, Ctrl + Z, Ctr ...
- Cantor展开式
X=an*(n-1)!+an-1*(n-2)!+...+ai*(i-1)!+...+a2*1!+a1*0! 其中,a为整数,并且0<=ai<i(1<=i<=n).这就是康托展开 ...
- C/C++二叉树搜索树操作集
啥是二叉查找树 在数据结构中,有一个奇葩的东西,说它奇葩,那是因为它重要,这就是树.而在树中,二叉树又是当中的贵族.二叉树的一个重要应用是它们在查找中的应用,于是就有了二叉查找树. 使二叉树成为一颗二 ...
- win7系统不能用telnet命令的两种解决方法
电脑专业人员对telnet命令都不陌生了,Telnet当成一种通信协议,在日常工作中,经常面对网络问题的人都会用到telnet命令,因为简单有效,可以帮助更快的找出问题.要是在使用过程中碰到win7纯 ...