現在テーブルにある値を取得し、それらを「正規化」するために、MySQLでストアドプロシージャを作成しました。これは、ストアドプロシージャに渡される値ごとに、その値がすでにテーブルにあるかどうかを確認することを意味します。そうである場合は、その行のIDを変数に格納します。値がテーブルにない場合は、新しく挿入された値のIDが格納されます。次に、ストアドプロシージャは、IDを取得して、元の非正規化テーブルと同等のテーブルに挿入しますが、このテーブルは完全に正規化されており、主に外部キーで構成されています。
この設計での私の問題は、ストアドプロシージャが戻るまでに約10ミリ秒かかることです。これは、約1,000万件のレコードを処理しようとすると長すぎます。私の疑惑は、パフォーマンスが私が挿入をしている方法に関係しているということです。すなわち
INSERT INTO TableA
(first_value)
VALUES
(argument_from_sp) ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id);
SET @TableAId = LAST_INSERT_ID();
「ONDUPLICATEKEYUPDATE」は、重複キーでは何も更新したくないので、行のid値を返すだけなので、ちょっとしたハックです。ただし、この手順を実行しなかった場合、「SET ...」ステートメントを実行しようとすると、LAST_INSERT_ID()関数が間違った値を返します。
MySQLでこれを行うためのより良い方法を知っている人はいますか?