1

私は最近、その仕事をしてすべてのデータが収集される調査アプリケーションを作成しました。今、私はデータを分析する必要があり、私はいくつかの時間の問題を抱えています。何人の人がどのオプションを選択したかを調べて、すべてを表示する必要があります。

私はこのクエリを使用していますが、これはその仕事をします:

SELECT COUNT(*)
  FROM survey
 WHERE users = ? AND table = ? AND col = ? AND row = ? AND selected = ?
 GROUP BY users,table,col,row,selected

「?」で明らかなように 必要に応じてMySQLi(php)を使用してデータをフェッチしていますが、これが原因でデータが非常に遅くなるのではないかと心配しています。

テーブルは上記のすべての要素(+一意のID)で構成され、それらはすべて整数です。いくつかの分野を説明するために:各調査は、フォームを選択するために1から10の幸福度で3つまたは4つのテーブル(2x3から5x5のサイズ)に分割されました。(質問は表の右側と上部にあり、質問が交差する場所に回答します)

ユーザー-年齢層

表、行、列-上記で説明

選択-dooooh上記で説明

調査が完了し、テーブルに約100万のエントリがあるため、クエリは非常に遅くなっています。3分ほどかかることもあれば、(おそらく)制限時間が切れてデータがまったく得られないこともあります。また、私は完全なデータベースにアクセスできません。貸衣装業者はちょっと妄想的であるため、空の「テスト」データベースにアクセスできます:S(そして彼のサーバーは少し遅いようです)

さて(最初のエッセイの後)私の質問は次のとおりです。調査中に大量のデータが書き込まれるため、意図的にインデックスを除外しました。これは悪い考えです。しかし、この時点では新しいデータが入ってこないので、テーブルのすべてのフィールドにインデックスを付けるのは理にかなっていますか?10を超えることのない整数にインデックスを付けることはどの程度意味がありますか?(あなたが推測できるように、私はインデックスについての手がかりを持っていません)。このテーブルのプライマリ一意IDが必要ですか?私

インデックス付けがグループ化に役立つ可能性があることをどこかで読みましたが、テーブルの最初の列でグループ化する場合に限ります(IDが最初であり、私の観点からは役に立たないので、それを削除して何かを得ることができますか?)

基本的に同じことをより短い期間で行うクエリを作成する別の方法はありますか?

事前にすべての提案をありがとう!

4

1 に答える 1

2

「GROUPBY」または「WHERE」を実行するエントリにインデックスを追加します。つまり、users、table、col、rowを組み込んだ、ケースで選択された1つのインデックスです。

いくつかの簡単なルール:

  • フィールドを組み合わせて、WHEREを最初に、GROUPBY要素を最後にします。
  • その一部のみを使用する他のクエリ(users、table、col、selectedなど)がある場合は、欠落している値(この例では行)を最後に残します。

あまり多くのインデックス/インデックスを使用しないでください。それぞれがテーブルの更新をわずかに遅くするためです。したがって、非常に大規模なシステムでは、クエリとインデックスのバランスをとる必要があります。


編集:これらはWHEREで使用されるため、GROUP BY user、col、rowが必要ですか。WHEREがすでにそれらを除外している場合は、「選択済み」でグループ化するだけで済みます。

于 2012-05-16T10:59:28.190 に答える