You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LOAD DATA INFILE导入大文件时所有记录updated_at时间戳相同的原因

问题

使用LOAD DATA INFILE导入2GB(约500万条记录)的文件耗时约3分钟,未在导入语句中指定updated_at字段值,但所有记录的updated_at时间戳完全一致(示例:2023-05-07 06:26:36)。按常理无法在1秒内完成所有插入,至少秒数应存在差异,特此询问该现象的原因。

执行命令如下:

mysql -h$1 -u$2 -p$3 --local-infile=1 -e "LOAD DATA LOCAL INFILE '$4' INTO TABLE abc FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES ( legal_name, pg_merchant_id, ip_addr)"

表结构:

CREATE TABLE `abc` (
   `pg_merchant_id` varchar(10) NOT NULL,
   `legal_name` varchar(100) NOT NULL,
   `ip_addr` varchar(150) NOT NULL,
   `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
   `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    KEY `updated_at_idx` (`updated_at`)
) 
原因分析
  • CURRENT_TIMESTAMP的计算时机:MySQL执行批量导入时,CURRENT_TIMESTAMP取的是整个LOAD DATA语句启动瞬间的时间,而非每条记录插入的实时时间。一旦语句开始执行,这个时间值就固定了,所有依赖该默认值的字段都会统一使用这个时间,不会随插入过程的推进而更新。
  • 批量操作的性能优化:LOAD DATA是MySQL针对批量导入做了特殊优化的工具,它会尽量减少单条记录的处理开销,不会为每条插入单独计算时间戳。这种设计是为了最大化导入效率,避免频繁计算时间带来的性能损耗。
  • ON UPDATE规则未触发:updated_at字段的ON UPDATE CURRENT_TIMESTAMP规则仅在记录被修改时生效。插入操作时未指定该字段值,只会使用DEFAULT CURRENT_TIMESTAMP的初始值(即语句启动时间),不会因为导入过程耗时而改变时间戳。

内容的提问来源于stack exchange,提问作者AKASH CHOUDHURY

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 08:25:34