3

複数の質問に対する一意の制約に関する質問がたくさんありますが、特に探しているものと一致するものはありません。これが1つの重複である場合は、お詫び申し上げます。

私はただのテーブルを持っています:tableA_id tableB_id

私の主キーは両方のテーブルの一意の制約であり、両方の列にインデックスがあります。両方とも、それらの重要なテーブルへの主キーでもあります。

tableA の行数が 10,000,000 行で、table B の行数が 2,000,000 行である可能性が高い場合、TableB がこの制約を受ける回数ははるかに少なくなる可能性が高くなります。それは悲しいことですが、TableB を最初の列として配置するように一意の制約を作成しているときに、TableA を検索することが少ないため (そうであればなぜ)、それとも最初に 1 つを検索しないので違いはありませんか?もう一方は、むしろ両方を見て 1 つずつ進みます。

前もって感謝します

4

2 に答える 2

3

通常、複合インデックスの左側に、より明確な値を持つ列を配置することをお勧めします。これにより、より選択的なインデックスが作成され、特定の値を見つけるのに適しています。

引用フォームMySQLドキュメント

行を考慮から除外します。複数のインデックスから選択できる場合、MySQL は通常、行数が最も少ないインデックス (最も選択的なインデックス) を使用します。

しかし、テーブルへの挿入の失敗を最適化しようとしているように見える印象があります。また、テーブルへの書き込みが読み取りよりも多く、ほとんどの書き込みが重複している場合は、おそらく正しいでしょう。ただし、後者の場合でも、MySql は他の列の一意性をチェックする必要があります。したがって、より明確な値を持つ列を最初に配置することをお勧めします。

于 2011-12-15T08:30:06.033 に答える
0

あなたの説明から、私はあなたが次のものを持っていると仮定します:

UNIQUE (tableA_id, tableB_id)
INDEX (tableA_id)
INDEX (tableB_id

その場合、単一列インデックスtableA_idは必要ありません。これを使用できるステートメントは、主キーからのインデックスも使用できるためです。したがって、少なくとも tableA_id の単一列インデックスを削除できます。

MySQL のオプティマイザーは、 を含むステートメントに PK インデックスを使用するほどスマートではないと思いますWHERE tableB_id = 42

したがって、ステートメントでその ID を単一の基準として使用する場合は、その列に単一の列インデックスを保持することをお勧めします。

常に両方の ID を使用してそのテーブルにクエリを実行する場合、単一の列のインデックスを保持する必要はありません。

于 2011-12-15T09:11:16.860 に答える