4

ここでのこの質問に基づいて、テーブルからNOTNULL列を選択するポスターの1つが言った

本番環境ではSELECT*を使用しないでください。

私の質問:本番サーバーのmysqlクエリでSelect *を使用すべきではないというのは本当ですか?はいの場合、なぜすべて選択を使用すべきではないのですか?

4

3 に答える 3

4

データベース サーバーは、データベースにクエリを実行するプログラムと同じマシン上にあるとは限らないことに注意してください。データベース サーバーは、帯域幅が制限されたネットワーク上にある可能性があります。それは世界の半分にさえなる可能性があります。

  • 本当にすべての列が必要な場合は、必ず実行してくださいSELECT * FROM table
  • ただし、特定の列のみが必要な場合はSELECT * FROM table、列の半分を破棄するだけですべての列を要求すると、帯域幅が浪費されます。

必要な正確な列を指定することをお勧めするその他の潜在的な理由:

  • データベース構造は変更される場合があります。プログラムが特定の列名を想定している場合、列名が変更された場合などに失敗する可能性があります。取得する列に明示的に名前を付けると、列名に関する想定に違反すると、プログラムがすぐに失敗します。
  • @Konerak が述べたように、必要な列に名前を付けると、テーブル スキーマが変更された場合でも (つまり、他の 2 つの列の間に 1 つの列を挿入するなど)、結果の列の順序が同じになります。結果FirstName[2]nd 要素であるかどうかによって異なります。

    (注: これを処理するより堅牢で自己文書化する方法は、データベースの結果を、PHP 連想配列、Perl ハッシュ、または Python などのキーと値のペアのリストとして要求することですdict。そうすれば、使用する必要がなくなります。結果にインデックスを付ける数値 ( name = result[2]) - 代わりに列名を使用できます: name = result["FirstName"].)

于 2012-04-10T08:12:02.137 に答える
4

ほとんどの人はSELECT *、物事を壊す傾向があるため、本番環境で使用しないようにアドバイスしています。ただし、いくつかの例外があります。

  • SELECT *すべての列をフェッチしますが、ほとんどの場合、すべてを必要とするわけではありません。これにより、SQL サーバーが必要以上の列を送信することになり、これは無駄であり、システムの速度を低下させます。
  • を使用SELECT *すると、後で列を追加するときに、古いクエリでもこの新しい列が選択されますが、通常は必要ありません。列に明示的に名前を付けると、これを防ぐことができます。
  • クエリを作成するほとんどの人はSELECT *、行を取得し、列の順序を使用して列を取得する傾向もあります。列が既存の列の間に挿入されると、コードが壊れます。
  • 列に明示的に名前を付けると、列が常に同じ順序になることも保証されますがSELECT *、テーブルの列の順序が変更されると、動作が異なる場合があります。

ただし、次のようなステートメントなど、例外があります。

INSERT INTO table_history
SELECT * FROM table 

そのようなクエリは、テーブルから行を取得し、それらを table_history に挿入します。新しい行がテーブルと table_history に追加されたときにこのクエリを引き続き機能させたい場合は、これが最適SELECT *です。

于 2012-04-10T08:08:43.427 に答える
0

を使用するSELECT *と、特に多くの列を持つテーブルの場合、非常に非効率的です。必要な列のみを選択してください。

これに加えて、列名を使用すると、クエリが読みやすくなり、維持しやすくなります。

于 2012-04-10T08:10:12.643 に答える