使用 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 服务器上


使用

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。导入过程中,文件会被分成多个数据块进行处理。

LOAD DATA INFILE增加“涡轮增压”,使加载数据文件 (CSV) 变得更快_MySQL

sbtest1.csv文件是(1.96 GB,1000万行记录) ,导入耗时: 3 分 16 秒

而如果直接使用LOAD DATA INFILE命令导入数据

LOAD DATA INFILE增加“涡轮增压”,使加载数据文件 (CSV) 变得更快_MySQL_02

导入耗时:5 分 31 秒