2

我正在阅读 Django Book 并遇到了有趣的声明。

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

我认为在这种确切的情况下不会有性能差异,这正是在某些情况下SELECT *可以变慢的原因。

于 2012-08-30T03:29:36.227 回答
0

在许多情况下,这显然不是更快,当其中一个更快时,它会略微领先:自己检查,对很多查询进行基准测试:)

在某些情况下,仅选择某些列可能会更快,包括仅选择组合索引上的列、避免读取整行以及避免访问 MySQL 上的 BLOB 或 TEXT 列时。

自然,如果您选择更少的列,您将在 MySQL 和您的应用程序之间传输更少的数据

于 2012-08-30T03:13:17.073 回答