• 一、需求

  • 二、实现再分析

  • 三、XeLabs TokuDB 介绍

  • 四、测试表

  • 五、测试环境说明


一、需求

一个朋友接到一个需求,从大数据平台收到一个数据写入在20亿+,需要快速地加载到MySQL中,供第二天业务展示使用。

二、实现再分析

对于单表20亿, 在MySQL运维,说真的这块目前涉及得比较少,也基本没什么经验,但对于InnoDB单表Insert 如果内存大于数据情况下,可以维持在10万-15万行写入。 但很多时间我们接受的项目还是数据超过内存的。 这里使用XeLabs TokuDB做一个测试。

三、XeLabs TokuDB 介绍

项目地址: https://github.com/XeLabs/tokudb

相对官方TokuDB的优化:

  • 内置了jemalloc 内存分配

  • 引入更多的内置的TokuDB性能指标

  • 支持Xtrabackup备份

  • 引入ZSTD压缩算法

  • 支持TokuDB的binlog_group_commit特性

四、测试表

TokuDB核心配置:

loose_tokudb_cache_size=4G
loose_tokudb_directio=ON
loose_tokudb_fsync_log_period=1000
tokudb_commit_sync=0

表结构

CREATE TABLE `user_summary` (`user_id` bigint(20) unsigned NOT NULL COMMENT '用户id/手机号',`weight` varchar(5) DEFAULT NULL COMMENT '和码体重(KG)',`level` varchar(20) DEFAULT NULL COMMENT '重量级',`beat_rate` varchar(12) DEFAULT NULL COMMENT '击败率',`level_num` int(10) DEFAULT NULL COMMENT '同吨位人数',UNIQUE KEY `u_user_id` (`user_id`)
) ENGINE=TokuDB DEFAULT CHARSET=utf8

利用load data写入数据

root@localhost [zst]>LOAD DATA INFILE '/u01/work/134-136.txt' \
INTO TABLE user_summary(user_id, weight, level, beat_rate,level_num);
Query OK, 200000000 rows affected (5 min 48.30 sec)
Records: 200000000 Deleted: 0 Skipped: 0 Warnings: 0

计算一下每秒写入速度:

root@localhost [zst]>select 200000000/(5*60+48.30);
+------------------------+
| 200000000/(5*60+48.30) |
+------------------------+
| 574217.6285 |
+------------------------+
1 row in set (0.00 sec)

文件大小:

-rw-r--r-- 1 root root 8.5G 11月 25 20:05 134-136.txt
-rw-r----- 1 mysql mysql 8.6K 11月 25 20:44 user_summary.frm
-rw-r----- 1 mysql mysql 3.5G 11月 25 20:51 user_summary_main_229_1_1d_B_0.tokudb

实际文件8.5G,写入TokuDB大小3.5G,只是接近于一半多点的压缩量。 对于20亿数据写入,实际测试在58分钟多点就可以完成。

可以满足实际需求,另外对于磁盘IO比较好的机器(SSD类盘,云上的云盘),如果内存和数据差不多情况,这量级数据量测试在Innodb里需要添加自增列,可以在3个小多一点完成。

从最佳实战上来看,Innodb和TokuDB都写入同样的数据,InnoDB需要花大概是TokuDB3-4倍时间。

文件大小区别,同样20亿数据:

-rw-r----- 1 mysql mysql 35G 11月 25 23:29 user2_main_26a_1_1d_B_0.tokudb
-rw-r----- 1 mysql mysql 176G 11月 26 03:32 user5.ibd

文件大小在5倍大小的区别。

测试结论:

利用TokuDB在某云环境中8核8G内存,500G高速云盘环境,多次测试可以轻松实现57万每秒的写入量。

另外测试几种场景也供大家参考: 如果在TokuDB中使用带自增的主键,主键无值让MySQL内部产生写入速度,下降比较明显,同样写入2亿数据,带有自建主键:

root@localhost [zst]>CREATE TABLE `user3` (
 -> `user_id` bigint(20) unsigned NOT NULL COMMENT '用户id/手机号',
 -> `weight` varchar(5) DEFAULT NULL COMMENT '和码体重(KG)',
 -> `level` varchar(20) DEFAULT NULL COMMENT '重量级',
 -> `beat_rate` varchar(12) DEFAULT NULL COMMENT '击败率',
 -> `level_num` int(10) DEFAULT NULL COMMENT '同吨位人数',
 -> `id` bigint(20) NOT NULL AUTO_INCREMENT,
 -> PRIMARY KEY (`id`),
 -> UNIQUE KEY `u_user_id` (`user_id`)
 -> ) ENGINE=TokuDB;
Query OK, 0 rows affected (0.03 sec)
root@localhost [zst]>LOAD DATA INFILE '/u01/work/134-136.txt' INTO TABLE user3(user_id, weight, level, beat_rate,level_num);
Query OK, 200000000 rows affected (22 min 43.62 sec)
Records: 200000000 Deleted: 0 Skipped: 0 Warnings: 0

同样的数据写入在主键自增无值产生时,不能使用TokuDB的 Bulk loader data特性,相当于转换为了单条的Insert实现,所以效果上慢太多。

关于TokuDB Bulk Loader前提要求,这个表是空表,对于自增列,如自增列有值的情况下,也可以使用。

建议实际使用中,如果自增列有值的情况下,可以考虑去除自增属性,改成唯一索引,这样减少自增的一些处理逻辑,让TokuDB能跑地更快一点。

另外在Bulk Loader处理中为了追求更快速的写入,压缩方面并不是很好。

关于TokuDB Bulk Loader :https://github.com/percona/PerconaFT/wiki/TokuFT-Bulk-Loader

五、测试环境说明

测试使用CentOS7环境,编译的XeLabs TokuDB版本百度云地址:https://pan.baidu.com/s/1qYRyH3I 。

来源:http://t.cn/E2TbCg5

在公众号后台回复"微信"关键字,加群主微信免费加入高大上的架构之路微信群,设为星标,备注架构之路,(公众号主免进!)

猜你喜欢

大牛是怎么思考设计SQL优化方案的?

在 Java 中如何优雅地判空

Redis 热点 Key 发现及常见解决方案!

史上最污技术解读,我竟然秒懂了

还在分析我写的 bug 啊,我都是随便写的!

老板,要你好看!

mysql varchar转bigint_MySQL 每秒 570000 的写入,如何实现?相关推荐

  1. 每秒570000的写入,MySQL如何实现?

    来源:吴炳锡 yq.aliyun.com/articles/278034 MySQL数据库如何实现每秒570000的写入,通过本文了解下. 一.需求 一个朋友接到一个需求,从大数据平台收到一个数据写入 ...

  2. MySQL 每秒 570000 的写入,如何实现?

    来源:吴炳锡 yq.aliyun.com/articles/278034 一.需求 一个朋友接到一个需求,从大数据平台收到一个数据写入在20亿+,需要快速地加载到MySQL中,供第二天业务展示使用. ...

  3. mysql varchar java_关于MySQL varchar类型最大值,原来一直都理解错了

    写在前面 关于MySQL varchar字段类型的最大值计算,也许我们一直都理解错误了,本文从问题出发,经实践验证得出一些实用经验,希望对大家的开发工作有些帮助~ 背景描述 最近同事在做技术方案设计时 ...

  4. mysql varchar,bigint,char三种类型性能的比较

    mysql varchar,bigint,char三种类型性能的比较 比较数据类型的性能好坏,数据表必须有足够的数据,我用25万条数据做测试 字段是手机号,用这三个类型哪个类型好呢.首先分析手机号有1 ...

  5. MySQL varchar类型可以存储多少个汉字

    MySQL varchar类型可以存储多少个汉字,多少个数字 具体要看的mysql版本 4.0版本以下,比如 varchar(100),指的是100字节,如果存放UTF8汉字时,只能存33个(每个汉字 ...

  6. mysql varchar字段自动忽略尾部空格

    背景 查询数据时,值带着空格也可以被查到,经查询,发现mysql varchar字段自动忽略尾部空格,特此记录 正文 参考该地址 MySQL comparison operator, spaces - ...

  7. mysql varchar(n) n表示字符个数

    (注:以下针对mysql 5.0以上版本) mysql varchar(n)  n表示字符个数,不是字节数. 对于utf8编码,无论是字符.数字.汉字均占3字节. varchar最大长度为65535个 ...

  8. mysql 取前几分钟和几秒,mysql 数据库取前后几秒 几分钟 几小时 几天的语句

    mysql 数据库取前后几秒 几分钟 几小时 几天的语句 发布时间:2020-09-24 12:48:06 来源:脚本之家 阅读:99 作者:mdxy-dxy 取当前时间: select curren ...

  9. MySQL varchar(255) 和 varchar(256) 区别

    引言 欢迎访问我的博客: http://blog.duhbb.com/ 原文地址: MySQL varchar(255) 和 varchar(256) 区别 正文 每次给表创建字段的时候, 遇到 VA ...

最新文章

  1. 大雁蛋人工孵化的方法_大鹅繁殖有哪些方法,您了解吗?
  2. centos升级python_CentOS 升级Python3
  3. Spring--Resource
  4. PMM (Percona MySQL Monitor) 部署
  5. 计算机科学家Erik Meijer眼中的Hacker Way工作方式
  6. winddows 运行指令 (2)
  7. Nodejs 操作 MongoDb 数据库
  8. MySQL 优化 —— ORDER BY 优化
  9. [文件系统]Image映象文件
  10. 2019递归实现字符串的逆序存储(C++)
  11. 任意切割一张图片成新图片
  12. python汇率转换代码中美_如何实现python汇率转换代码
  13. 【自学Python:Day2】磨洋工的我一周一课……
  14. 建立大数据分析能力需四大要素
  15. 人生在世,最大的笑话莫过于自作多情...
  16. 热敏打印机 图片指令打印图片
  17. Java 中 Boolean 和 boolean的默认值和修改默认值
  18. 企业级session管理框架:btg-session-jfinal
  19. ACM/ICPC 2018亚洲区预选赛北京赛站网络赛
  20. 向右看齐Look Up

热门文章

  1. srsLTE源码学习:RRC:(Radio Resource Control):无线资源控制协议
  2. OpenCV学习笔记:矩阵/向量处理
  3. python socket 主动断开_python之使用ctrl+c断开多线程(TcpSocketServer连接)出现端口占用的情况...
  4. Python:isinstance()和type()
  5. java url 缩略图_java根据url生成网页截图,缩略图 | 学步园
  6. python笔记记录(包和模块)
  7. java单一登录_java实现单一登录 踢人效果
  8. python-三层神经网络的分类回归问题
  9. Unity2017.3来了!洪流学堂第一时间送上更新日志简报
  10. java cropper 上传_java web 网站头像上传处理 (springmvc +bootstrap+cropper)