mysql varchar转bigint_MySQL 每秒 570000 的写入,如何实现?
一、需求
二、实现再分析
三、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 的写入,如何实现?相关推荐
- 每秒570000的写入,MySQL如何实现?
来源:吴炳锡 yq.aliyun.com/articles/278034 MySQL数据库如何实现每秒570000的写入,通过本文了解下. 一.需求 一个朋友接到一个需求,从大数据平台收到一个数据写入 ...
- MySQL 每秒 570000 的写入,如何实现?
来源:吴炳锡 yq.aliyun.com/articles/278034 一.需求 一个朋友接到一个需求,从大数据平台收到一个数据写入在20亿+,需要快速地加载到MySQL中,供第二天业务展示使用. ...
- mysql varchar java_关于MySQL varchar类型最大值,原来一直都理解错了
写在前面 关于MySQL varchar字段类型的最大值计算,也许我们一直都理解错误了,本文从问题出发,经实践验证得出一些实用经验,希望对大家的开发工作有些帮助~ 背景描述 最近同事在做技术方案设计时 ...
- mysql varchar,bigint,char三种类型性能的比较
mysql varchar,bigint,char三种类型性能的比较 比较数据类型的性能好坏,数据表必须有足够的数据,我用25万条数据做测试 字段是手机号,用这三个类型哪个类型好呢.首先分析手机号有1 ...
- MySQL varchar类型可以存储多少个汉字
MySQL varchar类型可以存储多少个汉字,多少个数字 具体要看的mysql版本 4.0版本以下,比如 varchar(100),指的是100字节,如果存放UTF8汉字时,只能存33个(每个汉字 ...
- mysql varchar字段自动忽略尾部空格
背景 查询数据时,值带着空格也可以被查到,经查询,发现mysql varchar字段自动忽略尾部空格,特此记录 正文 参考该地址 MySQL comparison operator, spaces - ...
- mysql varchar(n) n表示字符个数
(注:以下针对mysql 5.0以上版本) mysql varchar(n) n表示字符个数,不是字节数. 对于utf8编码,无论是字符.数字.汉字均占3字节. varchar最大长度为65535个 ...
- mysql 取前几分钟和几秒,mysql 数据库取前后几秒 几分钟 几小时 几天的语句
mysql 数据库取前后几秒 几分钟 几小时 几天的语句 发布时间:2020-09-24 12:48:06 来源:脚本之家 阅读:99 作者:mdxy-dxy 取当前时间: select curren ...
- MySQL varchar(255) 和 varchar(256) 区别
引言 欢迎访问我的博客: http://blog.duhbb.com/ 原文地址: MySQL varchar(255) 和 varchar(256) 区别 正文 每次给表创建字段的时候, 遇到 VA ...
最新文章
- 大雁蛋人工孵化的方法_大鹅繁殖有哪些方法,您了解吗?
- centos升级python_CentOS 升级Python3
- Spring--Resource
- PMM (Percona MySQL Monitor) 部署
- 计算机科学家Erik Meijer眼中的Hacker Way工作方式
- winddows 运行指令 (2)
- Nodejs 操作 MongoDb 数据库
- MySQL 优化 —— ORDER BY 优化
- [文件系统]Image映象文件
- 2019递归实现字符串的逆序存储(C++)
- 任意切割一张图片成新图片
- python汇率转换代码中美_如何实现python汇率转换代码
- 【自学Python:Day2】磨洋工的我一周一课……
- 建立大数据分析能力需四大要素
- 人生在世,最大的笑话莫过于自作多情...
- 热敏打印机 图片指令打印图片
- Java 中 Boolean 和 boolean的默认值和修改默认值
- 企业级session管理框架:btg-session-jfinal
- ACM/ICPC 2018亚洲区预选赛北京赛站网络赛
- 向右看齐Look Up
热门文章
- srsLTE源码学习:RRC:(Radio Resource Control):无线资源控制协议
- OpenCV学习笔记:矩阵/向量处理
- python socket 主动断开_python之使用ctrl+c断开多线程(TcpSocketServer连接)出现端口占用的情况...
- Python:isinstance()和type()
- java url 缩略图_java根据url生成网页截图,缩略图 | 学步园
- python笔记记录(包和模块)
- java单一登录_java实现单一登录 踢人效果
- python-三层神经网络的分类回归问题
- Unity2017.3来了!洪流学堂第一时间送上更新日志简报
- java cropper 上传_java web 网站头像上传处理 (springmvc +bootstrap+cropper)