对于 2 GB 文件,加载 DATA INFILE 大约需要 3 分钟。updated_at列设置为 DEFAULT CURRENT_TIMESTAMP

Load DATA INFILE taking approx 3min for a 2 GB file. updated_at column set to DEFAULT CURRENT_TIMESTAMP

提问人:AKASH CHOUDHURY 提问时间:6/10/2023 最后编辑:James ZAKASH CHOUDHURY 更新时间:6/10/2023 访问量:46

问:

所有记录都具有相同的 TIMESTAMP 值。 我没有在 LOAD DATA INFILE 语句中为updated_at列设置任何值。 为什么会有这样的行为

预计秒数会有所不同,因为不可能在 1 秒内插入 500 万条记录。

2023-05-07 06:26:36 示例。至少某些记录的秒数应该不同

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`)
) 
mysql 数据文件

评论

0赞 AKASH CHOUDHURY 6/10/2023
假设默认列值 in 对整个语句仅计算一次
1赞 RiggsFolly 6/10/2023
欢迎,为了提高您对 SO 问题必须与编程有关的体验,请参观并阅读如何提问,主题问题,然后查看问题检查列表完美问题以及如何创建一个最小、完整和可验证的示例
1赞 RiggsFolly 6/10/2023
请记住,我们无法读懂您的想法或猜测您的数据库、OR Load 语句或数据的确切设计。
0赞 AKASH CHOUDHURY 6/10/2023
@RiggsFolly更新了结构。请提供您的意见
0赞 RiggsFolly 6/10/2023
为什么只要上传所有记录,这都是一个问题

答:

0赞 ysth 6/10/2023 #1

CURRENT_TIMESTAMP将是 LOAD 语句开始的时间。这在文档中有所说明:

https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_current-timestamp

CURRENT_TIMESTAMP 和 CURRENT_TIMESTAMP() 是 NOW() 的同义词。

https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_now

NOW() 返回一个常量时间,指示语句开始执行的时间。(在存储的函数或触发器中,NOW() 返回函数或触发语句开始执行的时间。这与 SYSDATE() 的行为不同,后者返回执行的确切时间。

我建议您在加载完成后设置updated_at;如果执行加载文件并在事务中更新,则它们不会看到以前的值。

即便如此,另一个团队也需要知道任何报表或交易可能需要的时间,并寻找至少过去那么久updated_at。如果它们只是与当前时间进行比较,它们将错过一些更新或插入。