MyISAM批量导入前必须执行ALTER TABLE ... DISABLE KEYS以禁用非唯一索引实时更新,LOAD DATA后再ENABLE KEYS一次性重建索引,可提速3–5倍;需调大myisam_sort_buffer_size等参数、使用服务端文件路径、避免误用CONCURRENT或LOCAL,并确保最终启用索引。

MyISAM表LOAD DATA前必须执行ALTER TABLE ... DISABLE KEYS
MyISAM在插入数据时默认会为每行更新非唯一索引,导致大批量导入时性能断崖式下降。对非空表,DISABLE KEYS能彻底关闭非唯一索引的实时更新,只在ENABLE KEYS时一次性重建,实测可提速3–5倍。
注意:DISABLE KEYS对空表无效(MyISAM本就延迟建索引),且仅影响KEY(非UNIQUE KEY或PRIMARY KEY);UNIQUE_CHECKS对MyISAM无作用,不用设。
- 操作顺序必须是:
ALTER TABLE tbl_name DISABLE KEYS→LOAD DATA INFILE ...→ALTER TABLE tbl_name ENABLE KEYS - 若中途中断,索引处于损坏状态,需手动
REPAIR TABLE或重跑整个流程 -
ENABLE KEYS阶段会锁表,期间所有读写被阻塞,建议在低峰期执行
调大MyISAM专属缓冲区参数提升排序速度
MyISAM在ENABLE KEYS阶段需要排序索引键值,依赖myisam_sort_buffer_size和bulk_insert_buffer_size。默认值(几MB)面对千万级数据会频繁磁盘交换,拖慢重建索引时间。
临时生效(当前session):
SET SESSION myisam_sort_buffer_size = 256 * 1024 * 1024; SET SESSION bulk_insert_buffer_size = 256 * 1024 * 1024;
全局生效(需重启或SET GLOBAL,但部分版本不支持动态修改myisam_sort_buffer_size):
SET GLOBAL myisam_sort_buffer_size = 256 * 1024 * 1024;
- 值设太高可能挤占其他线程内存,建议不超过物理内存的25%
-
bulk_insert_buffer_size只对MyISAM批量插入有效,InnoDB无视该参数 - 确认生效:执行
SHOW VARIABLES LIKE '%buffer_size%';
避免LOCAL修饰符引发的客户端文件传输瓶颈
用LOAD DATA LOCAL INFILE时,MySQL客户端会先读取本地文件、再通过网络发给服务端,文件越大,网络传输+协议解析开销越明显。实际导入耗时可能50%花在传输上,而非写入。
正确做法是把文件放到MySQL服务器本地,用LOAD DATA INFILE(去掉LOCAL):
- 文件路径必须是服务端绝对路径,如
'/var/lib/mysql-files/data.csv' - 确保MySQL用户对该路径有读权限(Linux下常需
chown mysql:mysql /path) - 禁用
local_infile系统变量可强制走服务端文件路径,避免误用LOCAL
如果只能用LOCAL,务必检查max_allowed_packet是否足够(文件大小不能超过它),否则直接报错Lost connection to MySQL server during query。
CONCURRENT修饰符不是万能加速器
CONCURRENT允许其他线程在LOAD DATA执行时读取MyISAM表,但前提是表“中间没有空闲块”——即连续插入、未发生过DELETE或UPDATE。现实中,只要表有过删改,CONCURRENT自动失效,退化为普通LOAD。
更关键的是:CONCURRENT会略微降低单次导入速度(因需维护并发安全结构),除非你明确需要边导入边查,否则别加。
- 验证是否生效:导入中另起连接执行
SHOW OPEN TABLES WHERE In_use > 0;,若目标表In_use为1,说明未并发 -
LOW_PRIORITY会让导入等待所有读完成,适合读多写少场景,但会拉长总耗时,慎用 - MyISAM本身不支持事务,
LOAD DATA失败不会回滚,务必提前备份原表
MyISAM批量导入的真正瓶颈不在SQL层,而在索引重建阶段的I/O与内存调度。很多人调了innodb_buffer_pool_size却对MyISAM参数视而不见,结果白优化。最易忽略的一点:DISABLE KEYS后忘记ENABLE KEYS,表看似导入成功,实则索引全失效,后续查询变全表扫描。



















