导读:MySQL数据库如何实现每秒570000的写入,通过本文了解下。
[size=15]loose_tokudb_cache_size=4G表结构:
loose_tokudb_directio=ON
loose_tokudb_fsync_log_period=1000
tokudb_commit_sync=0[/size]
[size=15]CREATE TABLE `user_summary` (利用load data写入数据
`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[/size]
[size=15]root@localhost [zst]>LOAD DATA INFILE '/u01/work/134-136.txt' [/size]计算一下每秒写入速度:
[size=15]INTO TABLE user_summary(user_id, weight, level, beat_rate,level_num);[/size]
[size=15]Query OK, 200000000 rows affected (5 min 48.30 sec)[/size]
[size=15]Records: 200000000 Deleted: 0 Skipped: 0 Warnings: 0[/size]
[size=15]root@localhost [zst]>select 200000000/(5*60+48.30);[/size]文件大小:
[size=15]+------------------------+[/size]
[size=15]| 200000000/(5*60+48.30) |[/size]
[size=15]+------------------------+[/size]
[size=15]| 574217.6285 |[/size]
[size=15]+------------------------+[/size]
[size=15]1 row in set (0.00 sec)[/size]
[size=15]-rw-r--r-- 1 root root 8.5G 11月 25 20:05 134-136.txt[/size]实际文件8.5G,写入TokuDB大小3.5G,只是接近于一半多点的压缩量。对于20亿数据写入,实际测试在58分钟多点就可以完成。可以满足实际需求,另外对于磁盘IO比较好的机器(SSD类盘,云上的云盘),如果内存和数据差不多情况,这量级数据量测试在Innodb里需要添加自增列,可以在3个小多一点完成。从最佳实战上来看,Innodb和TokuDB都写入同样的数据,InnoDB需要花大概是TokuDB3-4倍时间。文件大小区别,同样20亿数据:
[size=15]-rw-r----- 1 mysql mysql 8.6K 11月 25 20:44 user_summary.frm[/size]
[size=15]-rw-r----- 1 mysql mysql 3.5G 11月 25 20:51 user_summary_main_229_1_1d_B_0.tokudb[/size]
[size=15]-rw-r----- 1 mysql mysql 35G 11月 25 23:29 user2_main_26a_1_1d_B_0.tokudb文件大小在5倍大小的区别。
-rw-r----- 1 mysql mysql 176G 11月 26 03:32 user5.ibd[/size]
[size=15]root@localhost [zst]>CREATE TABLE `user3` (同样的数据写入在主键自增无值产生时,不能使用TokuDB的 Bulk loader data特性,相当于转换为了单条的Insert实现,所以效果上慢太多。
-> `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[/size]
https://github.com/percona/PerconaFT/wiki/TokuFT-Bulk-Loader
作者:吴炳锡
本文为 @ 21CTO 创作并授权 21CTO 发布,未经许可,请勿转载。
内容授权事宜请您联系 webmaster@21cto.com或关注 21CTO 公众号。
该文观点仅代表作者本人,21CTO 平台仅提供信息存储空间服务。