在mysql官方文档的描述里,load data infile加载数据要比普通的insert快20倍,可以说是插入数据最快的方式了,所以在很多场合都会用它来提升入库速度。
那它在主从架构中的从库上会怎么执行呢?(主从复制官网)刚开始我假定是在master上load成功后会以batch insert方式dump进binlog,从库IO线程请求binlog,最后SQL线程以batch insert执行一遍,同样能做到主从同步。但即使是batch insert方式,按照官方文档的解释,也是会比load data infile慢的。在master端load压力足够大的情况下,主从延迟可能会无法忍受。带着这样的疑问,我准备做个测试
准备一个数据的文件(2M)为了防止load过快而无法在从库上观察到,设置循环load 30次,然后在从库端show processlist观察执行情况,结果如下截图:
通过测试可以发现
load data infile在master端执行成功后会把数据文件写入到binlog里(可用mysqlbinlog分析),在从库IO线程获取binlog写到本地relay-log,SQL线程会将数据文件extract到临时目录(默认/tmp,见tmp.io.dir变量值),再执行load命令将数据文件加载进从库(在从库show processlist可以观察到此现象),最终把数据临时目录的文件删除掉。