2011-03-04 4 views
0

可能性の重複:fooからselect *はどのような意味を持っていますか?

:より多くのDBAの洞察力を持つ人々からこれを聞いて興味が、どのようなパフォーマンスの影響はあなたのようなクエリを見たときからアプリケーション顔をし
Can select * usage ever be justified?

select * from some_large_table;

インデックスがbでないため、フルテーブルスキャンを実行する必要があります私はO表記を話しているならば、ここでNは表のサイズであるここでO(N)を話していると私は信じています。これは通常、最適な動作ではないと考えられていますか?あなたが本当に特定の時間にテーブルからすべてを必要とする場合はどうなりますか?はい、ページネーションなどのツールがありますが、ここではデータベースの観点から厳密に話しています。このようなふるまいは、通常、ぶつかるのですか?

+0

通常、データベースの場合、大きなO表記はディスクIOの数を指し、算術演算ではありません –

+1

パフォーマンスの影響を除いて、決して 'select * from ... 'を使用することはお勧めしません。どうして?あなたの質問は将来の証明ではありません。今日は4列あると想像してください。クエリから4つの列が必要です。将来、ある列が追加または削除されたり、2つの列がその表に入れ替わったりすることを想像してみてください。すべての地獄が緩んでいる可能性があります。ですから、あなたが必要とする全ての列を明示的に '選択する '方が良いでしょう。それ以上はない。 – darioo

+0

@アーメンTsirunyan:議論のポイント。うまく設計され、チューニングされたサーバーは常にインデックスをメモリに保持します。したがって、ディスクI/Oが実行されていなくても、B-Treeインデックスから何かをフェッチするにはO(logN)がかかります。 – zerkms

答えて

1

列を指定しないと、DBエンジンは列一覧のマスタテーブルデータをクエリする必要があります。このクエリは非常に高速ですが、パフォーマンスの問題が軽微です。 JOIN文またはネストされたクエリを使用して厄介なSELECT *をやっていない限り、あなたはうまくいくはずです。ただし、DBエンジンに列を検索するためのクエリを実行させることによるパフォーマンスへの影響は小さいことに注意してください。

+0

"列を指定しないと、DBエンジンが列リストのマスターテーブルデータをクエリする必要があります。 - - だから何?テーブル全体をフェッチしているときにボトルネックではありません。私はテーブルのメタ情報がほとんど常にメモリにキャッシュされているとは言いません。 – zerkms

0

MySQLサーバはサーバ側でカーソルを開いてそのテーブルを読み取ります。問合せのクライアントは、すべてのレコードを読み取ることはできません。また、クライアントのパフォーマンスは、実際にフェッチしたレコードの数のみに依存します。また、サーバー側のクエリのパフォーマンスは、いくつかの条件でクエリよりも速くなる可能性があります。クライアントがすべてのレコードをフェッチした場合のみ、全テーブルスキャンと同等です。

0
  1. 必要以上の列を選択すると(select *)常に不良です。あなたが持っている以上のことをしないでください
  2. テーブル全体から選択する場合は、インデックスを持っているかどうかは関係ありません。

他の問題は、テーブルをロックする方法です。ビジー状態のアプリケーションの場合、返されるデータの不一致により、ロックが完全に行われないようにしたくない場合があります。しかし、あまりにも強くロックすると、クエリがさらに遅くなる可能性があります。 O(n)は、あらゆるコンピュータサイエンスアプリケーションで受け入れられると考えられています。しかし、データベースでは、時間内に測定する。&読み取り/書き込み回数。これは膨大な数の読み込みであり、おそらく実行に時間がかかります。したがって、それは容認できません。

関連する問題