概要 単一指数とは何か、複合指数とは何か? 新しい複合指数を作成するタイミングと、その複合指数で注意すべき点は何ですか? この記事は主にインターネット上のいくつかの議論の要約です。
1。 コンセプト
単一インデックスとは、インデックスが1列にリストされている状況のことであり、新しいインデックスを作成するという文が1つの列だけに実装されている状態です。
ユーザーは複数の列にインデックスを作成することができ、これを複合インデックス(複合インデックス)と呼びます。 複合指数は単一指数とまったく同じ方法で作成されます。 しかし、複合インデックスはデータベース操作時のオーバーヘッドが少なく、複数の単一インデックスを置き換えることができます。 テーブルの行数がキー数を大きく上回る場合、この方法はテーブルのクエリ速度を大幅に高速化できます。
同時に2つの概念があり、狭いインデックスと広いインデックスがあります。狭いインデックスは1〜2列のインデックスを指し、特に指定がない限り一般的に単一のインデックスを指します。 ワイドインデックスとは、2列以上のインデックスのことです。
指数設計の重要な原則は、幅広の指数よりも狭い指数を使用することです。なぜなら、狭い指数は結合指数よりも効果的である傾向があるからです。 インデックスが狭いほど、最適化器に選択肢が増え、パフォーマンス向上に役立つことが多いです。
2。 用途
インデックス作成 table1(col1,col2,col3)でインデックスidx1を作成します。 尋ねる 表1から col1=A、col2=B、col3=C から*を選択します。
この時点でクエリオプティマイザーはテーブルをスキャンするのではなく、インデックスから直接データを取得します。なぜなら、インデックスにはオーバーレイクエリと呼ばれるデータがあり、クエリ速度が非常に速いからです。
3。 注記:
1. 複合インデックスの使用時 where条件ではフィールドがインデックスされ、複数のフィールドが使われている場合は複合インデックスが使われます。 一般的には、selectフィールドにインデックスは作らないでください(mytableからselect col1, col2, col3をクエリしたい場合は上記のインデックスは必要ありません)。 条件に基づくインデックス作成は非常に重要な原則です。 インデックスを使いすぎると、テーブルの更新効率に大きな影響を及ぼします。テーブルを操作する際にインデックス作成に多くの時間を費やさなければならないからです。
2. 複合インデックスの場合、クエリを使用する場合、インデックスを見つける順序に従うのが最も効率的です。 例えば: IDX1:table1(col2,col3,col5)でインデックスidx1を作成 表1から col2=A、col3=B、col5=D から*を選択します。
もし「table1から col3=B、col2=A、col5=D」から*を選択する場合 また、「table1からcol3=Bから*を選択する」とインデックスが使われず、効果が気づかれません
3. 複合指数は単一の指数に取って代わるのか? 多くの人は、任意のフィールドをクラスタインデックスに追加すればクエリ速度が向上すると考えていますが、混乱している人もいます。複合クラスタインデックスフィールドを別々にクエリした場合、クエリ速度は遅くなるのでしょうか? この質問では、次のクエリ速度(結果セットは250,000件のデータ)を見てみましょう:(。日付列fariqiは複合集約インデックスの開始列で1位、ユーザー名neibuyonghuは2番目にランクインします。
IDX1:create index idx1 on Tgongwen(fariqi,neibuyonghu)
(1)貢文からギッド、ファリチ、ネイブヨンフの称号を選びます ここでfariqi>'2004-5-5'
クエリ速度:2513 ms
(2)公文からギッド、ファリチ、ネイブヨンフ、称号を選択 ここでfariqi>'2004-5-5'、neibuyonghu=「事務所」
クエリ速度:2516 ms
(3)貢文からギッド、ファリチ、ネイブヨンフの称号を選択 内布雍会=「事務所」
クエリ速度:60280ミリ秒
上記の実験から、クラスタ化されたインデックスの開始列のみをクエリ条件として使用した場合、複合クラスタインデックスを持つすべての列のクエリ速度はほぼ同じで、クエリ結果セット数が同じ場合にすべての複合インデックス列を使うよりもわずかに速くなります。 複合集約インデックスの開始列でない列のみをクエリ条件として使用した場合、このインデックスは何もしません。 もちろん、文1と文2のクエリ速度は同じです。クエリのエントリ数が同じであるため、複合インデックスのすべての列が使われ、クエリ結果が少ない場合、これにより「インデックスオーバーライド」が形成され、パフォーマンスを最適化できます。 また、集計インデックスの他の列を頻繁に使うかどうかにかかわらず、先頭の列が最も頻繁に使われる列である必要があります。
[参考文献:クエリ最適化およびページ化アルゴリズムスキーム http://blog.csdn.net/chiefsailor/archive/2007/05/28/1628339.aspx]
4. 同じ列に単一のインデックスと複合インデックスを同時に作成する必要がありますか? 実験:Sysbase 5.0テーブルテーブル1 フィールド:col1、col2、col3
テストステップ: (1) col1 にインデックス idx1 を作成する table1からselect*を実行し、col1=Aがidx1を使用します。 table1からselect*を実行し、col1=Aおよびcol2=Bもidx1を使用します。
(2) インデックスidx1を削除し、(col1,col2)複合インデックスにidx2を作成します 両方のクエリはidx2を使用します
(3) 両方のインデックス idx1 と idx2 が存在する場合 col1='A'がidx1を使うのではなく、col1=A、col2=Bがidx2を使う場所です。 クエリオプティマイザーは、以前によく使われていたインデックスの一つを使用しています。 idx1かidx2のどちらかを使ってください。
次のように見ることができます (1) テーブルの場合、(col1, col2)に複合インデックスがある場合、同時にcol1に単一のインデックスを作成する必要はありません。 (2) クエリ条件が要求する場合、col1にすでに単一のインデックスがある場合に(col1, col2)に複合インデックスを加えることができ、これにより効率がある程度向上します。 (3) 複数のフィールド(5または6フィールドを含む)を同時に持つ複合インデックスを設定することに特に大きな利点はありませんが、相対的に見て、複数の狭いフィールド(最大2フィールドのみを含む)を組み合わせたインデックスを確立することで、より効率的かつ柔軟性が向上します。
5. クエリをカバーする必要がありますか? 一般的に、完全なクエリカバレッジを強調する戦略は採用しないのが最善です。 Select節のすべての列がクラスタでないインデックスで上書きされている場合、オプティマイザはこれを認識し良好なパフォーマンスを提供します。 しかし、これによりインデックスが広すぎることや、最適化者がポリシーを利用する可能性に過度に依存してしまうことがよくあります。 通常、狭いインデックスはより多くのクエリに用いられ、大規模なクエリに対してより良いパフォーマンスを提供します。 |