【问题标题】:SQL, Why is looking up data explicitly faster than SELECT *SQL,为什么显式查找数据比 SELECT * 快
【发布时间】:2012-08-24 17:39:05
【问题描述】:

我正在阅读 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;

【问题讨论】:

标签: mysql sql django database-design django-models


【解决方案1】:
  1. 性能(仅当您选择的列少于表中的列数时才重要
  2. 我不确定 Django 是如何工作的;但在某些语言/数据库驱动程序中,如果您更改表架构(例如添加新列),“select *”将导致错误。这是因为 DB 驱动程序“缓存”了表架构,现在其内部架构与表架构不匹配。

【讨论】:

  • 非常感谢为什么'select *'会导致错误!!
【解决方案2】:

如果您有 100 列,SELECT * 将返回所有列的数据。显式列出列将减少返回的列,从而减少服务器和应用程序之间传输的数据量。

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 很明显,如果我选择更少的列,我将传输更少的数据。但我要问的是为什么 Django 不使用 SELECT * 而是显式调用每一列。在官方网站的书中,它说显式优于隐式?为什么更好?
    【解决方案4】:

    我认为在这种确切情况下不会有性能差异,这正是 在某些情况下SELECT * 可能会更慢的全部意义所在。

    【讨论】:

      猜你喜欢
      • 2013-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-20
      • 2013-11-21
      • 1970-01-01
      • 2018-12-28
      • 1970-01-01
      相关资源
      最近更新 更多