5

クエリで 2 つのフィールドの範囲を使用している場合に、データのインデックスを設計する方法を見つけようとしています。

expenses_tbl:
idx        date     category      amount
auto-inc   INT       TINYINT      DECIMAL(7,2)
PK

列カテゴリは、経費のタイプを定義します。娯楽、服装、教育などのように、他の列は明らかです。

このテーブルに対する私のクエリの 1 つは、特定の日付範囲で費用が 50 ドルを超えているすべてのインスタンスを見つけることです。このクエリは次のようになります。

SELECT date, category, amount 
FROM expenses_tbl
WHERE date > 120101 AND date < 120811 
      AND amount > 50.00;

この特定のクエリに対して、このテーブルのインデックス/セカンダリ インデックスを設計するにはどうすればよいですか。

前提: テーブルは非常に大きい (現在はありませんが、学習の余地があります)。

4

3 に答える 3

3

通常、MySQL は複合インデックスの複数の部分の範囲をサポートしていません。日付のインデックスまたは金額のインデックスのいずれかを使用しますが、両方を使用することはできません。それぞれに 1 つずつ、2 つのインデックスがある場合、インデックス マージが行われる可能性がありますが、よくわかりません。

EXPLAINこれらのインデックスを追加する前後を確認します。

CREATE INDEX date_idx ON expenses_tbl (date);
CREATE INDEX amount_idx ON expenses_tbl (amount);

複合インデックス範囲 - http://dev.mysql.com/doc/refman/5.5/en/range-access-multi-part.html

インデックス マージ - http://dev.mysql.com/doc/refman/5.0/en/index-merge-optimization.html

于 2012-08-11T21:59:36.773 に答える
1

まだ言及されていないいくつかのポイント:

インデックス内の列の順序によって違いが生じる場合があります。これらのインデックスの両方を試してみてください。

(date, amount)
(amount, date)

どちらを選ぶ?一般に、最も選択的な条件をインデックスの最初の列にする必要があります。

  • 日付範囲が大きいが、50 ドルを超える費用がほとんどない場合amountは、インデックスで最初に表示する必要があります。
  • 日付範囲が狭く、ほとんどの費用が $50 を超える場合は、date最初に設定する必要があります。
  • 両方のインデックスが存在する場合、MySQL は推定コストが最も低いインデックスを選択します。

両方のインデックスを追加してから、の出力を見て、EXPLAIN SELECT ...MySQL がクエリに選択するインデックスを確認できます。


また、カバリングインデックスを検討することもできます。列を (最後の列として) インデックスに含めることによりcategory、クエリに必要なすべてのデータがインデックスで利用可能になるため、MySQL はクエリの結果を取得するためにベース テーブルを調べる必要がまったくありません。

于 2012-08-11T22:09:53.690 に答える
0

あなたの質問に対する一般的な答えは、2 つのキーを持つ複合インデックスが必要だということです。1 つ目は日付で、2 つ目は金額です。

このインデックスは、日付または日付と費用に制限があるクエリで機能することに注意してください。費用のみに制限のあるクエリでは機能しません。両方のタイプがある場合は、経費に関する 2 つ目のインデックスが必要になる場合があります。

テーブルが非常に大きい場合は、日付ごとにパーティション化し、各パーティション内で費用をかけてインデックスを作成することをお勧めします。

于 2012-08-11T21:53:01.023 に答える