2011-01-01 7 views
0

私はこれについて一度読んだことを覚えています。すべての列が必要な場合でも、単純に*を使用するのではなく、すべての目的の列を実際にリストするほうが速いのですか?それが依存sql-queryで "SELECT *"ではなく "SELECT one、two、three"を使用するのは本当に高速ですか?

おかげで、 マルッティレイン

+1

パフォーマンス上の理由を使用しないでください。メンテナンス性の理由から使用しないでください。つまり、誰かがALTER TABLEを行の下のどこかに置いてもクエリが壊れないようにしてください。 –

+1

http:/*パフォーマンスのための*および他の理由*のために/stackoverflow.com/questions/3639861/why-is-select-considered-harmful。 – BoltClock

+1

違いはありませんが、列を明示的に指定する方がより防御的です。たとえば、新しいBLOB列が追加された場合、これは自動的にクエリに含まれないようにします。システムテーブルの列名を調べるオーバーヘッドを避けるため、列を明示的に明示的に指定する方がやや効率的かもしれないと主張してきました。明示的に列挙されていても、パーサーがまだそれらが存在することを検証する必要があるからです。 –

答えて

2

selectカラムリストとselect *についての議論は決して見られませんでしたが、結果がまったく同じ場合のクエリのパフォーマンスについては決してありません。

質問は常にフォーム間で決定するときに、より保守性が高く、回答はクエリの使用をオンにすることによって決まります。

1

。あなたのテーブルが100の列を持っている間に3つの列だけを選択している場合。それより速いです。

とにかくすべての列を選択すると、単純に異なる表記法になります。

+0

"すべての列が必要な場合でも。" – Joshua

+1

@ジョシュア:私はそれを読んだが、完全性のために私は両方のバージョンの質問に答えた。 – Wolph

0

おそらくもっと速くなることの1つは、フィールドを渡すときにも注文を出すことです。それ以外の場合は、文字列でフィールドを取得するか、元のフィールドに戻す必要があります。私は単に "fieldX"が最初のフィールドか10番目のフィールドかを知らない。

これにより、コードが複雑になったり、ループ内に文字列ルックアップがあると、速度が大幅に低下する可能性があります。

1

テーブル内のすべてのフィールドを使用している場合は、*を使用してすべてのフィールドを一覧表示するとパフォーマンスに大きな違いはありません。

テーブルレイアウトを何らかの方法で変更した場合に違いが生じます。別のフィールドを追加すると、*を使用しているクエリは自動的にそのフィールドを返しますが、使用されなくなります。これにより、オーバーヘッドが増加し、レコードのデータがレコードをフェッチするために使用されるバッファよりも大きくなると、コードが失敗する可能性があります。

また、フィールドのリストは、指定された順序で返されることを意味します。テーブル内のフィールドの順序を変更すると、*を使用するクエリでもフィールドが返される順序が変更され、コードに問題が発生する可能性があります。例えば、BLOBフィールド(例えば、テキスト)は、それらが戻される順序で検索されなければならないか、値は破棄されなければならない。

0

実際のパフォーマンスの違いは、選択した列がすべてインデックスを通じて利用可能な場合に発生します。その場合、MySQL(および他のいくつかのDBMS)は、lotの可能性がある「インデックスのみの選択」を、テーブル自体からインデックスベースの選択を行うよりも速く行います。

さらに、ワイヤで不要なデータを送信する際のオーバーヘッドはもちろん、検索の速度も低下させます。

最後に、必要なデータのみを選択するだけで、簡単にコーディングすることができます。

関連する問題