2011-07-31 14 views
0

自分自身よりも経験が豊富な人からは、テーブル内の項目の数を数えたり(カテゴリのトピック数を数えるなど)、その値を保持している変数を保持してインクリメントするだけでよいでしょうそれを(カテゴリテーブルの余分なフィールド)と呼んでください。アイテムを数えたり、数字を増やしたりしますか?

2またはそれだけで非常にわずかであるとの間に有意な差があり、それがわずかであっても、一つの方法は、まだ他よりも良いでしょうか?特定のプロジェクトではないので、ユーザー数などの情報に基づいているのではなく、一般的に答えてください。

ありがとうございます。私のフォーラムで

+0

の新しい番号を取得するために必要なときにCOUNT()を実行し、格納された値を更新するために、減算/追加するよりも、どこかのカウントを格納します。 「なぜ、私たちはいつもCOUNT(*)をSQLで使うのですか?例えば – gbn

答えて

4

(テーブルの行)の項目数を取得するには、標準のSQLを使用して、需要

SELECT COUNT(*) FROM MyTable 

ノート、ケースには、私が何かを見逃して、各項目(行)でそれを行うだろう表には、部品番号、コード、自動インクリメントのいずれかの固有の識別子があります。したがって、新しい行を追加すると、列の「自動インクリメント」が発生する可能性があります。

これは「行数」とは無関係です。 DELETEまたはROLLBACKのため、数値が連続していない可能性があります。

行数を別々に維持しようとすると、涙や災害が発生する可能性があります。新しい行識別子を生成するために、COUNT(*)+ 1またはMAX(ID)+1を使用しようとすると、私はあなたの質問についていくつかの混乱があると思い

+0

値を取得するにはまだDBクエリを実行する必要があるので、一度に値を取得することもできます。次に、行を数えることは、おそらくそこで最も単純なクエリの1つであり、高速であることになります(まっすぐな値を取得するよりも)。 – Christian

+1

@Christian Sciberras:COUNTを使用しないためのトレードオフは、カウントを個別に維持する同時実行性の問題です。 – gbn

+0

私は可能な限りワイルドカード*を避けようとしています。データセットがGIANTの場合、データ設計で共通する固有の(そして最も重要な)識別子ではなく、すべてのデータを取得するのがはるかに遅くなります。 – Blake

0

私はこのようなフォーラムでは、サブスレッドを数える:

SELECT COUNT(forumid) AS count FROM forumtable 

限り、あなたはどのようなフォーラムおよび/またはサブセクションを指定することと同じである識別子を使用しているとして、列にインデックスキーがある場合は非常に高速です。したがって、必要以上に列を追加する必要はありません。

+0

彼はテーブルの中の要素を数えたいと思っています.auto_incrementはそれには向いていません。 – duedl0r

+0

はい、テーブルの項目数をフィールドとして比較していました。たとえば、フォーラムのカテゴリのテーブルにあるフォーラムで作成されたトピックの数を、統計。 – Ruffy

+0

ああ、テーブルに行を数えようとしていて、IDをもう1つ追加するのが好きなようだった。私の答えを調整してみましょう。 – Blake

1

さらに悪くなります。私の解釈はselect count(*)か、あなたの実際の数を追跡する列かどうかです。

理由がない場合は、そのような列を追加しません。これは時期尚早の最適化であり、ソフトウェア設計が複雑になります。

また、別の場所に同じ情報が保存されないようにする必要があります。カウントは簡単な作業なので、実際に情報を複製することは悪い考えです。

0

私はちょうど数えていくつもりです。パフォーマンス上の問題が発生した場合は、他のオプションも検討できますが、別の値を保持するとすぐに正しいことを確認するための作業が必要です。 COUNT()を使用すると、実際の番号を「馬の口からまっすぐに」得ることができます。

基本的には、実行するまで最適化を開始しないでください。 COUNT()を使用してすべてが正常に動作する場合は、それを実行します。それ以外の場合ではなく、多分あなたはあなたの意図と自分の考えを明確にすべき項目

関連する問題