1

我在 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 中执行此操作的更好方法?

4

2 回答 2

2

我已经返回并创建了一个函数来处理这种情况:

CREATE DEFINER=`root`@`%` FUNCTION `value_update`(inValue VARCHAR(255)) RETURNS int(11)
BEGIN
        DECLARE outId INT;
        SELECT valueId INTO outId FROM ValuesTable WHERE value = inValue;

        IF outId IS NULL THEN
                INSERT INTO ValuesTable (value) VALUES (inValue);
                SELECT LAST_INSERT_ID() INTO outId;
        END IF;

        RETURN outId;
END

前面提到的存储过程调用这些函数而不是执行 INSERT 语句本身。在性能方面,上述功能在我的设置中更快(使用 ndb 表类型)。此外,在对我的应用程序的所有部分进行基准测试后,我发现这导致的性能问题只是整体性能瓶颈的一小部分。

于 2010-06-17T04:26:25.940 回答
0

如果您已经有唯一标识符,是否需要有一个自动递增的主键?

于 2010-07-08T08:08:23.300 回答