2MUCH

Mysql之“load data”学习

2023-04-22


Mysql使用load data 来进行数据导入,本文给出我在测试Mysql导入时的一些收获

load data 官网用法

可参考: https://dev.mysql.com/doc/refman/8.0/en/load-data.html

LOAD DATA 
[LOW_PRIORITY | CONCURRENT] [LOCAL] 
INFILE '_file_name_' 
[REPLACE | IGNORE] 
INTO TABLE _tbl_name_ 
[PARTITION (_partition_name_ [, _partition_name_] ...)] 
[CHARACTER SET _charset_name_] 
[{FIELDS | COLUMNS} 
	 [TERMINATED BY '_string_'] 
	 [[OPTIONALLY] ENCLOSED BY '_char_'] 
	 [ESCAPED BY '_char_'] 
] 
[LINES 
	 [STARTING BY '_string_'] 
	 [TERMINATED BY '_string_'] 
] 
[IGNORE _number_ {LINES | ROWS}] 
[(_col_name_or_user_var_ [, _col_name_or_user_var_] ...)] 
[SET _col_name_={_expr_ | DEFAULT} [, _col_name_={_expr_ | DEFAULT}] ...]

介绍

LOAD DATA语法用于读取文件的行到表中,速度很快。它相当于是SELECT ... INTO OUTFILE 的反向过程。mysqlimport 也可以作为导入的方法,它的原理是将LOAD DATA语句发到服务端。

本地vs非本地操作(Non-LOCAL Versus LOCAL Operation)

使用了LOCAL修饰符,会有以下影响:

[mysql]
local-infile=1

[mysqld]
local-infile=1

[mysql] and [mysqld]分别是客户端和服务端配置,区别主要如下:

上述方法是设置默认的local-infile=1。一般是重启mysql生效。但需要注意的是,这里的“重启生效”仅针对服务端的设置(即[mysqld]的设置)。对于客户端([mysql])的设置,无需重启,只需重新打开客户端连接到mysql服务,即可生效。

还有以下方法可以分别进行客户端和服务端的设置,如: 1、当前客户端会话开启:

mysql --local-infile=1 -u username -p

2、设置全局变量local_infile(服务端)

SHOW GLOBAL VARIABLES LIKE 'local_infile';
SET GLOBAL local_infile = 'ON';
SHOW GLOBAL VARIABLES LIKE 'local_infile';

需要注意的是,这种服务端设置会立刻生效,无需像在my.cnf中配置需要重启生效。但是这种方法只会对当前运行的 MySQL 实例生效,并且在 MySQL 实例重启后会丢失。

因此,如果想要长久的客户端和服务端local_infile参数的设置,需要在配置文件my.cnf中设置。如果仅需要当前客户端会话或当前服务实例生效,可采取下面的设置方法。

输入文件字符集(Input File Character Set)