0

わかりましたインデックス作成をいつ使用する必要があるか、およびそれを使用することの長所と短所についての基本を知っています。

これらは、クエリが次のように見える (唯一の) 2 つの方法です。

SELECT target_id FROM map WHERE table_name = '' AND fingerprint = '' AND source_id = 1;

SELECT fingerprint, source_id FROM map WHERE table_name = '' AND target_id = 1;

fields にインデックスを付け、最初のクエリを実行する必要があることはわかってtable_namefingerprintますsource_id。またtarget_id、2番目のクエリで行きます。私はそれを個別に行うことができます。しかし、すべてのフィールドを 1 つとしてインデックス化できれば、複合キーのパフォーマンスが向上すると聞いたことがあります。私の場合は非常に具体的であるため、別の WHERE 句が存在しないため、次のような複合キーを作成することを考えました。

(table_name, fingerprint, source_id)

(table_name, target_id)

しかし、table_name両方の複合インデックスが重複しているため、それが正しい方法かどうかはわかりません。このような重複によるパフォーマンスへの影響はありますか?

私がいくつかのテストを行ったとき、パフォーマンスの向上は得られませんでした.どちらも同じように高速でした.現在、数万のレコードしか持っていません.それが理由かもしれません. ただし、データは数百万のレコードにスケーリングされます。そこで専門家の意見を聞いてみようと思いました。ありがとう。

4

1 に答える 1

1

実行しようとしているクエリに関しては、持っている 2 つのインデックスは正しいものです。ただし、table_name フィールドのインデックス作成についてはよくわかりません。VARCHAR フィールドのインデックスは非常に遅くなる傾向があり (この回答は PostgreSQL を参照していますが、基本的な概念は同じです)、INSERT を大幅に遅くしながらデータベースのサイズを大きくする可能性があります。

私が使用する解決策は、ルックアップ テーブルを作成することです。VARCHAR フィールドを取得するクエリが必要な場合は、ルックアップ テーブルで JOIN を実行するだけです。INT の JOIN は、かなり高速でスケーラブルになる傾向があります。

于 2012-06-26T14:24:08.747 に答える