作者:杨涛涛
资深数据库专家,专研 MySQL 十余年。善于 MySQL、PostgreSQL、MongoDB 等开源数据库相干的备份复原、SQL 调优、监控运维、高可用架构设计等。目前任职于爱可生,为各大运营商及银行金融企业提供 MySQL 相干技术支持、MySQL 相干课程培训等工作。
本文起源:原创投稿
* 爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。
MySQL 8.0.22 在往年的 10 月 19 日公布,给咱们带来很多十分实用的个性。特地是对 MySQL Shell 8.0.22 来说,UTIL 组件性能更多,更加丰盛,应用更加简略。
比方明天咱们来介绍 import_table(importTable) 的延申性能:可定制化行输出。
import_table(importTable) 咱们之前有介绍过,是一款并行导入各种格局文本的工具,封装了 MySQL 语句 load data local infile。
比如说要导入一个以 TAB 为分隔符的文本数据文件:/tmp/sample_ytt.txt 到表:ytt_new.t1,能够执行上面语句:
下面后果是 load data infile 语句的导入后果。如果改用 import_table 办法来做同样的事件,基于 Python 语法,应用办法如下:
那接下来看另外一个需要:在导入文本文件时对每行做预处理(例如在导入数据之前更改列 r2 的值为 mod(r1,10),列 r5 的值为 abs(r4-46)),这样能够缩小导入后再次解决的工夫开销。
这个需要用 load data infile 语句非常容易实现:(导入时更改列 r2 和 r5 的数据,相似 UPDATE 语法)
那如果要用 util.import_table(importTable) 来实现下面的需要,在 MySQL 8.0.22 之前是没方法的。
随着 MySQL 8.0.22 的公布,MySQL 对 import_table 办法做了些裁减性能,其中减少了一个选项“decodeColumns”能够实现字段的事后输出定制化性能,并且还能够更加丰盛。
接下来用 import_table 来实现下面的需要,定制化字段 r2 和 r5:
以上 Options 选项,见下图:
我来具体解释下上图的含意:蓝色字体 columns 对应的数组别离指定数据文件中的每行字段,也就是默认的 TAB 分隔符所宰割的每列值,1 和 2 代表占位符,1 代表数据文件中每行的第一个列,2 代表数据文件中每行的第四列,decodeColumns 字典别离对须要事后输出的字段做解决。比方 r1 字段保留为变量 @1,r2 字段对应 mod(r1,10) 等。
如果还是不太了解变换规定,能够长期关上 general log,下面 import_table(importTable)对应的 MySQL 日志为:
以上日志写的很分明,外部转换为最根本的 load data infile 语法。
那这里我简略解读了下 MySQL 8.0.22 对 MySQL Shell 的一项定制化输出文本文件的新个性,更多的新个性能够持续关注。