3

という名前のテーブルがありhitlist、3 つの列があります。

int id
long hitlisted_date
long deleted_date

これらの列に基づいて、このテーブルにクエリを実行します。

histlisted_date (frequent)
hitlisted_date && deleted_date (frequent)
deleted_date (not frequent)

このような場合、どのようなインデックスを使用すればよいですか?

  1. hitlisted_date&の個別インデックスdeleted_date
  2. hitlisted_date&のグループ インデックスdeleted_date

アップデート

テーブルには 1000 ~ 5000 行しかありません。
これらは、使用されるクエリ パターンです。

1) hitlisted_date BETWEEN
2) hitlisted_date <
3) deleted_date = -1 and hitlisted_date <=
4) deleted_date > 0

上記のパターンの場合、これらのインデックスで十分でしょうか?

  1. CREATE INDEX i1_hitlist ON hitlist(hitlisted_date);
  2. CREATE INDEX i2_hitlist ON hitlist(deleted_date, hitlisted_date);
4

2 に答える 2

4

hitlisted_dateと の組み合わせが頻繁に使用されるため、最初の 2 つの列に複合インデックスが必要ですhitlisted_date

CREATE INDEX i1_hitlist ON hitlist(hitlisted_date, deleted_date);

このインデックスはhitlisted_date、単独で、または 2 つの日付に対して、適切な条件を持つクエリに使用できます (また使用する予定です)。

だけに 2 番目のインデックスを作成すると便利な場合がありますdeleted_date

CREATE INDEX i2_hitlist ON hitlist(deleted_date);

これは での検索に使用できますdeleted_date。1 つの削除された日付とヒット リストに含まれる日付の範囲で検索を行う場合は、次の逆の複合インデックスを使用する方がよい場合がありますi1_hitlist

CREATE INDEX i2_hitlist ON hitlist(deleted_date, hitlisted_date);

役に立たない可能性はありますが、確認する唯一の方法は、実際に試してみることです。これは、クエリ パターンと、クエリが使用する実際の条件によって異なります。

ただのインデックスには本当の美徳はありませんhitlisted_date。オプティマイザーの邪魔になるだけです (オプティマイザーは 2 つのインデックスを調べてどちらが良いかを判断する必要があり、行が挿入、更新、削除されるため、実行する作業が増えるためです)。ヒットリストの日付が一意のインデックスである可能性は低いです。可能であれば、単一列インデックスと重複インデックスを保持する別の理由があります。( (A, B, C) にインデックスがある場合、 (A,B) のインデックスは冗長であるも参照してください。)

インデックスを変更した後、統計が最新であることを確認し (最近は多かれ少なかれ自動化されていますが、以前は重要でした)、SET EXPLAIN をオンにしてクエリを実行し、インデックスが使用されていること (およびどのインデックスが使用されているか) を確認します。使用されています)。

于 2012-12-14T03:24:55.073 に答える
1
CREATE CLUSTER INDEX clusidx ON hitlist(hitlisted_date,deleted_date);
CREATE         INDEX ddatidx ON hitlist(deleted_date);

テーブルの行数が少ない場合は、列にインデックスを付ける価値はないかもしれませんが、行数が多い場合はそうです。このテーブルには3つの列しかないため、膨大な数の行でインデックス作成が問題になることはありません。

例:

13個のVARCHAR列と2個のDATE列を持つ静的な読み取り専用テーブルがあります。

行の長さ=557、行の長さ=12,398,250。

複数の列を含む頻繁なクエリはないため、7つの個別の列のインデックスを作成しますが、特定の列の組み合わせが頻繁にクエリされる場合は、それらのクエリの複合列インデックスを作成します。

于 2012-12-14T02:54:49.847 に答える