ここでのこの質問に基づいて、テーブルからNOTNULL列を選択するポスターの1つが言った
本番環境ではSELECT*を使用しないでください。
私の質問:本番サーバーのmysqlクエリでSelect *を使用すべきではないというのは本当ですか?はいの場合、なぜすべて選択を使用すべきではないのですか?
ここでのこの質問に基づいて、テーブルからNOTNULL列を選択するポスターの1つが言った
本番環境ではSELECT*を使用しないでください。
私の質問:本番サーバーのmysqlクエリでSelect *を使用すべきではないというのは本当ですか?はいの場合、なぜすべて選択を使用すべきではないのですか?
データベース サーバーは、データベースにクエリを実行するプログラムと同じマシン上にあるとは限らないことに注意してください。データベース サーバーは、帯域幅が制限されたネットワーク上にある可能性があります。それは世界の半分にさえなる可能性があります。
SELECT * FROM table
。SELECT * FROM table
、列の半分を破棄するだけですべての列を要求すると、帯域幅が浪費されます。必要な正確な列を指定することをお勧めするその他の潜在的な理由:
@Konerak が述べたように、必要な列に名前を付けると、テーブル スキーマが変更された場合でも (つまり、他の 2 つの列の間に 1 つの列を挿入するなど)、結果の列の順序が同じになります。結果FirstName
の[2]
nd 要素であるかどうかによって異なります。
(注: これを処理するより堅牢で自己文書化する方法は、データベースの結果を、PHP 連想配列、Perl ハッシュ、または Python などのキーと値のペアのリストとして要求することですdict
。そうすれば、使用する必要がなくなります。結果にインデックスを付ける数値 ( name = result[2]
) - 代わりに列名を使用できます: name = result["FirstName"]
.)
ほとんどの人はSELECT *
、物事を壊す傾向があるため、本番環境で使用しないようにアドバイスしています。ただし、いくつかの例外があります。
SELECT *
すべての列をフェッチしますが、ほとんどの場合、すべてを必要とするわけではありません。これにより、SQL サーバーが必要以上の列を送信することになり、これは無駄であり、システムの速度を低下させます。SELECT *
すると、後で列を追加するときに、古いクエリでもこの新しい列が選択されますが、通常は必要ありません。列に明示的に名前を付けると、これを防ぐことができます。SELECT *
、行を取得し、列の順序を使用して列を取得する傾向もあります。列が既存の列の間に挿入されると、コードが壊れます。SELECT *
、テーブルの列の順序が変更されると、動作が異なる場合があります。ただし、次のようなステートメントなど、例外があります。
INSERT INTO table_history
SELECT * FROM table
そのようなクエリは、テーブルから行を取得し、それらを table_history に挿入します。新しい行がテーブルと table_history に追加されたときにこのクエリを引き続き機能させたい場合は、これが最適SELECT *
です。
を使用するSELECT *
と、特に多くの列を持つテーブルの場合、非常に非効率的です。必要な列のみを選択してください。
これに加えて、列名を使用すると、クエリが読みやすくなり、維持しやすくなります。