0

私はInnoDBでMySQLを使用しています。

セマンティクスの観点から主キーは必要ないので、主キー(または一意のインデックス)を使用すると、一意でないインデックスよりもクエリが高速になりますか?

インデックスに適しているが一意ではない2つの列があります。ただし、2つの列の組み合わせは常に一意です。列もnullではありません。

2つの一意でない列をインデックスとして設定するだけでよいのでしょうか、それとも2つの列の組み合わせに対して主キーを作成するのでしょうか。

アクセスパターンは通常、最初の列が指定された値である2つまたは4つの行を変更します(そして、すべての組み合わせが一意であると述べたように、2番目の列は異なります)。

たとえば、col1とcol2は次のようになります

1 1
1 2
1 3
1 5
2 1
2 2
2 3
2 5
3 1
3 2
3 3

例として、行(1、2)と(1、3)を一度に変更します。

フォローアップの質問はデータ型についてです。col1はsmallintに適合し、col2はtinyintに適合します。ただし、単一のインデックスに結合する場合、intよりも小さい型や異なる型を使用した場合のパフォーマンスへの影響はわかりません。マニュアルには、主キーに使用すると複数の列が連結されると記載されています。同じタイプのsmallintを使用する方が良いですか?またはintを使用しますか?メモリアクセスに関しては、整列されていません、フルワードアクセスが最速ですか?これはここに影響を及ぼしますか?

4

1 に答える 1

1

使用するかどうかに関係なく、InnoDBには常に主キーがあります。InnoDBは、データを格納するためにクラスター化インデックスを使用します。これは、基本的に、主キーとデータが同じ場所にあることを意味します。適切なインデックスを定義しないと、内部インデックスが作成されます。これは、主キーが「無料」であることも意味します。データはインデックスに保存されるため、余分なスペースは必要ありません。両方の列を使用して更新する行を常に見つける場合は、必ず複合プライマリインデックスを作成する必要があります。データのフィルタリングに毎回2つの列を使用しない場合でも、複合プライマリインデックスの恩恵を受ける可能性があります。

データ型については、両方をできるだけ小さくします。インデックスがメモリ内でどのように処理されるかについての詳細はわかりませんが、メモリアクセスの違いにより、おそらく大きな違いを測定することはできず、インデックスサイズを小さくしても問題はありません。

于 2012-11-02T00:30:00.650 に答える