3

これは一般的なデータベースの質問だと思いますが、私は MySQL を使用しています。

6 つの数値列で構成されるテーブルがあります。これらのうち最初の 5 つが主キーを構成します。

これは大きなテーブル (2,000 万行以上) であるため、一部のクエリには時間がかかります (約 10 秒)。これ自体はそれほど長くはありませんが、多くのクエリを実行する必要があります。

主キーが自動的にインデックス付けされることを理解しています。通常クエリを実行する主キー内のいくつかの列のグループを個別にインデックス付けする利点はありますか?

つまり、5 つの主キー列のうち最初の 3 つに対して定期的にクエリを実行する場合、これら 3 つの追加のインデックスを作成する必要がありますか?それとも、既に主キー インデックスの一部であるため、冗長でしょうか?

4

2 に答える 2

3

1 行またはごく少数の行を返すクエリの場合、10 秒はかなり長い時間です。ただし、クエリがテーブルの内容の 3% を返す場合、10 秒は長すぎません。

あなたのプライマリユニークキーは複合インデックスによってバックアップされています。

  (I1,I2,I3,I4,I5)

次のようなクエリは正しいです

  WHERE I1 = val AND I2 = val AND I3 = val

  WHERE I3 = val AND I2 = val AND I1 = val

主キー用に作成されたインデックスを使用する必要があります。重要なことは、複合インデックス内の列が、左端の列から始めてすべて使用されることです。のようなクエリ

  WHERE I3 = val AND I4 = val AND I5 = val

主キーの複合インデックスは、使用されたとしてもあまりうまく使用されません。キーで指定された列の値に対して何らかの計算を行うクエリも同様です。

  WHERE I1+I2+I3=sumvalue

「動作するはず」と「動作する」は同じではないことに注意してください。MySQL で EXPLAIN コマンドを使用して、DBMS がクエリに対して期待どおりに動作しているかどうかを確認してください。

http://dev.mysql.com/doc/refman/5.1/en/explain.html

于 2012-06-18T13:16:35.020 に答える
0

いくつかのテスト クエリを作成し、テーブルのコピーにインデックスを作成して、そのパフォーマンスを確認してみませんか?

パフォーマンスに関しては、意見を信頼するよりも測定する方が常に優れています。

データベースの「最適な」ソリューションは、関連するテーブルの特定の詳細に大きく依存します。列の値の範囲、値の分布、クエリの種類、選択/削除/挿入/更新クエリの相対頻度など。

そうは言っても、クエリで使用されるすべての列がサブセットに含まれている場合、サブセットのインデックスが役立つと思います。インデックスに結果セット (select の列) を含めると、パフォーマンスが向上する場合があります。

于 2012-06-18T07:04:55.453 に答える