2

私はDjangoBookを読んでいて、興味深い声明に出くわしました。

Notice that Django doesn’t use SELECT * when looking up data and instead lists
 all fields explicitly. This is by design:
 in certain circumstances SELECT * can be slower,

これはhttp://www.djangobook.com/en/1.0/chapter05/から入手しました

したがって、私の質問はSELECT *、すべての列を明示的に呼び出すよりも、なぜ遅くなる可能性があるのか​​を誰かが説明できるかどうかです。いくつか例を挙げていただければ幸いです。または、反対のことを考えている場合(それは問題ではありません)、その理由を説明できますか?

アップデート:

それがテーブルです:

BEGIN;
CREATE TABLE "books_publisher" (
    "id" serial NOT NULL PRIMARY KEY,
    "name" varchar(30) NOT NULL,
    "address" varchar(50) NOT NULL,
    "city" varchar(60) NOT NULL,
    "state_province" varchar(30) NOT NULL,
    "country" varchar(50) NOT NULL,
    "website" varchar(200) NOT NULL
);

そして、それがDjangoが呼び出す方法SELECT * FROM book_publisherです:

SELECT
    id, name, address, city, state_province, country, website
FROM book_publisher;
4

4 に答える 4

2
  1. パフォーマンス(テーブルにあるよりも少ない列を選択している場合にのみ重要になります
  2. Djangoがどのように機能するかはわかりません。ただし、一部の言語/データベースドライバでは、テーブルスキーマを変更すると(たとえば、新しい列を追加すると)、「select*」によってエラーが発生します。これは、DBドライバーがテーブルスキーマを「キャッシュ」し、その内部スキーマがテーブルスキーマと一致しないためです。
于 2012-08-30T14:56:05.290 に答える
1

100列の場合、SELECT *はすべての列のデータを返します。列を明示的にリストすると、返される列が減るため、サーバーとアプリケーション間で送信されるデータの量が減ります。

于 2012-08-30T03:13:10.817 に答える
0

多くの場合、これは明らかに速くはありません。そのうちの1つが速い場合は、わずかな差があります。自分で確認し、多くのクエリをベンチマークします:)

結合インデックスにある列のみを選択する場合、行全体を読み取る必要がない場合、MySQLでBLOBまたはTEXT列にアクセスしない場合など、場合によっては一部の列のみを選択する方が高速な場合があります。

そして当然、より少ない列を選択すると、MySQLとアプリケーション間で転送されるデータが少なくなります

于 2012-08-30T03:13:17.073 に答える
0

この正確なケースでは、パフォーマンスの違いはないと思います。これは、特定の状況SELECT *では遅くなる可能性があるということです。

于 2012-08-30T03:29:36.227 に答える