我在 MySQL 中编写了一个存储过程来获取当前表中的值并“规范化”它们。这意味着对于传递给存储过程的每个值,它都会检查该值是否已经在表中。如果是,那么它将该行的 id 存储在一个变量中。如果该值不在表中,则存储新插入的值的 id。存储过程然后获取 id 并将它们插入到一个表中,该表等效于原始的去规范化表,但该表是完全规范化的,主要由外键组成。
我对这种设计的问题是存储过程大约需要 10 毫秒才能返回,当您尝试处理大约 1000 万条记录时,这太长了。我怀疑性能与我进行插入的方式有关。IE
INSERT INTO TableA
(first_value)
VALUES
(argument_from_sp) ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id);
SET @TableAId = LAST_INSERT_ID();
“ON DUPLICATE KEY UPDATE”有点像 hack,因为在重复键上我不想更新任何东西,而只是返回行的 id 值。但是,如果您错过了这一步,当您尝试运行“SET ...”语句时,LAST_INSERT_ID() 函数会返回错误的值。
有谁知道在 MySQL 中执行此操作的更好方法?