* (アスタリスク) を使用せずに、必要なフィールドに名前を付けるということをよく耳にします。パフォーマンスの問題またはセキュリティ上の理由によるものですか? 誰かがこれについて良い議論をすることができますか?
そうではない
SELECT * FROM users WHERE name='John';
代わりに
SELECT name FROM users WHERE name='John';
* (アスタリスク) を使用せずに、必要なフィールドに名前を付けるということをよく耳にします。パフォーマンスの問題またはセキュリティ上の理由によるものですか? 誰かがこれについて良い議論をすることができますか?
そうではない
SELECT * FROM users WHERE name='John';
代わりに
SELECT name FROM users WHERE name='John';
本番クエリでアスタリスクを使用しない最大の理由は、非 SQL コードをデータベース スキーマの変更から隔離すること、またはそのような変更が見過ごされにくくすることです。
たとえば、コードname
が最初の列に a をaddress
、2 番目の列に a を期待するアスタリスクを使用してクエリを実行する場合、既に読み取っている 2 つの列の前に 3 番目の列を追加するようにスキーマが変更された場合、コードは代わりにその新しい列を取得します。また、住所の代わりに名前を入れます。最悪の事態は、クラッシュせずにすべてのことを実行することです。ユーザーは単にゴミデータを見るだけです。
対照的に、明示的に名前が付けられた列を持つクエリは、スキーマの変更にもかかわらず正しい列を取得するか、必要な列が削除または名前変更された場合に中断します。これにより、問題の原因がすぐに特定できるため、問題の調査と修正が容易になります。
それはパフォーマンスの問題です。の場合、テーブル内のすべてのフィールドをSELECT *
取得しています。の場合、名前フィールドのみを選択しています。必要なフィールドのみを選択すると、DBサーバーからアプリケーションに転送するデータが大幅に少なくなる可能性があります。SELECT name
SELECT*
は、テーブルからSELECT ALLを意味します。これにより、すべての列が選択されます。
ただし、クエリのように一部の列のみを選択するように指定した場合
SELECT name --->これは、name列のみを選択します
* を選択すると、そのクエリのすべての列が取得されるため、必要な列だけを取得するのではなく、データセットのメモリ使用量が高くなります。
私にとっては、正気、読みやすさ、常識の問題に似ています。
あなただけが必要なときname
- なぜそれを明示的に書かないのですか?
これにより、クエリが読者にとってより有益なものになります。
しかし、この「パフォーマンス」のがらくたに従うためだけに、何十ものフィールド名を明示的に書いている貧しい開発者を見ると、私は傷つきます。
コメントからの重要な注意:
クエリ内のフィールドの順序や数に依存しないコードを記述することは非常に重要です。
したがって、*
, fetch associative array を使用するだけで、コードがそのようなばかげた理由で壊れることはありません。
私の謙虚なテストでは、いくつかの違いがあります。0,0002 秒の端数。
まあ、そのような違いがアプリケーションの特定のボトルネックである場合は、明示的な書き込みフィールドを使用してください(ただし、パーサーがクエリを解析するのにより多くの時間がかかります
. . だから、私は気にしません。