4

複合インデックスを使用するよりも、インデックスを持つ単一のハッシュされた列を優先する必要がある場合を知りたいです。私の場合、約 100 万のデータセットを持つ 2 つのテーブルがあり、そのうちの 1 つは他のテーブルから更新された値を受け取ります (これはデータ インポート ルーチンです)。私の環境では MySQL 5.1 と 5.5 を使用しています。

例:

CREATE TABLE permanent (
ref_id_1 INT(10),
ref_id_2 INT(10),
ref_id_3 INT(10),
ref_id_4 INT(10),
ref_date DATE,
value INT(10));

CREATE TABLE import (
ref_id_1 INT(10),
ref_id_2 INT(10),
ref_id_3 INT(10),
ref_id_4 INT(10),
ref_date DATE,
value INT(10));

//Option 1
ALTER TABLE import ADD UNIQUE INDEX idx_composite(ref_id_1,ref_id_2,ref_id_3,ref_id_4,ref_date);
//Option 2
ALTER TABLE import ADD hash_col CHAR(32);
UPDATE import SET hash_col = MD5(CONCAT(ref_id_1,ref_id_2,ref_id_3,ref_id_4,ref_date)); 
ALTER TABLE import ADD UNIQUE INDEX idx_hash_col(hash_col);

もちろん、永続テーブルにも hash_col と必要なインデックスがあります。これで、可能な 2 つの更新/結合は次のようになります。

//Join via columns 
UPDATE permanent
INNER JOIN import
ON import.ref_id_1 = permanent.ref_id_2
AND import.ref_id_2 = permanent.ref_id_2
AND import.ref_id_3 = permanent.ref_id_3
AND import.ref_id_4 = permanent.ref_id_4
AND import.ref_date = permanent.ref_date 
SET permanent.value = import.value;

//Join via Hash-col
UPDATE permanent
INNER JOIN import
ON import.hash_col = permanent.hash_col
SET permanent.value = import.value

では、どのアプローチを優先すべきでしょうか? 「X列を超える場合は、代わりにハッシュを使用する」などの経験則はありますか。前もって感謝します!

ps これは私の最初の質問なので、何かが足りない場合はご容赦ください。

4

1 に答える 1

1

複合インデックスを使用します。10 個の整数を比較する方が、2 つの文字列を比較するよりも高速です。さらに、理論的には、MD5 ハッシュが一意であることが保証されているわけではありません (ただし、これはあまり実用的な問題ではありません)。

于 2012-11-05T22:56:54.513 に答える