使用 LOAD DATA INFILE 将任何大型 CSV 文件加载到 MySQL 服务器是一个非常耗时的过程,因为它是单线程的,而且也是单个事务,它无法充分利用到多核CPU的处理能力,已成为瓶颈。
现在你可以通过甲骨文的mysqlsh客户端,让其加载数据文件 (CSV) 变得更快!
https://cdn.mysql.com//Downloads/MySQL-Shell/mysql-shell-8.0.36-linux-glibc2.17-x86-64bit.tar.gz
内部工作流程 :
- util.importTable 将分析输入的数据文件
- util.importTable 将大文件分成若干块
- util.importTable 将通过并行线程把数据块更新到目标 MySQL 服务器上
使用
代码语言:javascript复制 MySQL JS > util.importTable("/data/mysql/tmp/sbtest1.csv", {
schema: "test", table: "sbtest1",
dialect: "csv-unix", skipRows: 0,
showProgress: true, fieldsOptionallyEnclosed: true,
fieldsTerminatedBy: ",", linesTerminatedBy: "n",
fieldsEnclosedBy: '"',threads: 8, bytesPerChunk: "1G"
})
含义:
util.importTable: 这是MySQL Shell中的一个函数,用于从文件导入数据到数据库表中。
"/data/mysql/hechunyang1/tmp/sbtest1.csv": 这是要导入的CSV文件的路径。
{}: 这是一个JavaScript对象,包含了导入数据的配置选项。
schema: "test": 指定目标数据库的模式(或称为数据库)名称,这里是"test"。
table: "sbtest1": 指定目标表的名称,这里是"sbtest1"。
dialect: "csv-unix": 指定了CSV文件的格式,这里是Unix风格的CSV格式。这个参数告诉MySQL Shell如何解析CSV文件的结构。
skipRows: 0: 指定跳过的行数,这里是0,表示不跳过任何行。
showProgress: true: 指定是否显示导入进度,这里设置为true,会显示导入进度信息。
fieldsOptionallyEnclosed: true: 指定字段是否用引号包围,这里设置为true,表示字段可以用引号包围。
fieldsTerminatedBy: ",": 指定字段之间的分隔符,这里是逗号(,),表示字段之间由逗号分隔。
linesTerminatedBy: "n": 指定行终止符,这里是换行符(n),表示每行数据以换行符结束。
fieldsEnclosedBy: '"': 指定字段的引号符号,这里是双引号(""),表示字段可以被双引号包围。
threads: 8: 指定用于导入数据的线程数,这里是8个线程。
bytesPerChunk: "1G": 指定每个数据块的大小,这里是1GB。导入过程中,文件会被分成多个数据块进行处理。
sbtest1.csv文件是(1.96 GB,1000万行记录) ,导入耗时: 3 分 16 秒
而如果直接使用LOAD DATA INFILE命令导入数据
导入耗时:5 分 31 秒