0

私は現在、アプリの作成を始めています。最も重要な部分は、20 列のテーブルです。このテーブルには、将来的に 3 ~ 5 ~ 7,000 のレコードが含まれます。フィルタリングの目的で、この特定のテーブルの 1 つの WHERE 句で複数の列をすべて結合する必要があります (より小さい、等しいなど)。列は、varchar、int、decimal、および date です。したがって、私の質問は、たとえば 3k 行がある場合、WHERE 句ですべてまたは 10 個を超える条件を使用すると、クエリが少し遅くなる可能性があります。どの列にインデックスを付けるかをどのように決定すればよいでしょうか。このようなクエリを最適化するにはどうすればよいですか。MySQL では 3 ~ 5 ~ 7,000 行では意味がないことはわかっています。問題は、テーブルに 20 列あることです。また、それが問題になる場合は、サーバー上で PHP を使用するつもりです。

前もって感謝します。

4

2 に答える 2

0

各テーブルには特定の動作があります。それぞれのケースを分析する必要があります。

一般的に、検索を高速化するには、where に含まれる 20 列のそれぞれにインデックスを作成する必要があります。一方、これは「挿入」を遅くし、多くのスペースインデックスを占有します。したがって、1列ごとにインデックスを追加するかどうかを分析する必要があります。

このインデックスにすべきでない列を決定するためのいくつかのヒント:

  • 値のある列を繰り返すことは避けてください。実行計画はインデックスを使用しません。
  • インデックス タイプを配置しないでください: varbinary。
  • 更新頻度の高い列。
于 2012-07-14T05:08:08.983 に答える
0

パフォーマンスの最適化よりも論理的な推測である主キーを特定したら、テーブルに追加のインデックスを追加できます。

mysql は、特定のテーブル参照内で一度に 1 つのインデックスしか効率的に使用できないことに注意してください。エンジンは実際にさまざまなインデックスを内部的にマージして両方を使用する可能性がありますが、パフォーマンスはあまり良くありません。(参照: http://www.mysqlperformanceblog.com/2009/09/19/multi-column-indexes-vs-index-merge )

私が提案するのは、処理する一連のクエリを特定し (他のテーブルとの最終的な結合も)、フィルター処理されたフィールドが多すぎる場合は、レコードをフィルター処理するための最も効率的なフィールドを特定することです。何が最も効率的かを知るには?たとえば、null 以外の一意のフィールドはかなり良い候補です。mysql はこれを照明と同じくらい速くフィルター処理します。

一般的に経験則として、高度に差別化された列/列セットを選択します。値を何度も繰り返さないでください。そうしないと、インデックスが非効率になります。

それは始まりです。

よろしく

于 2012-07-12T12:21:32.673 に答える