【问题标题】:Select * sql query vs Select specific columns sql query [duplicate]选择* sql查询与选择特定列sql查询[重复]
【发布时间】:2011-06-28 13:54:29
【问题描述】:

可能重复:
Why is SELECT * considered harmful?

可能是一个数据库 nOOb 问题。

我们的应用程序有一个如下表

表 WF

Field              | Type        | Null | Key | Default | Extra          |
+--------------------+-------------+------+-----+---------+----------------+
| id                 | int(11)     | NO   | PRI | NULL    | auto_increment | 
| children           | text        | YES  |     | NULL    |                | 
| w_id               | int(11)     | YES  |     | NULL    |                | 
| f_id               | int(11)     | YES  |     | NULL    |                | 
| filterable         | tinyint(1)  | YES  |     | 1       |                | 
| created_at         | datetime    | YES  |     | NULL    |                | 
| updated_at         | datetime    | YES  |     | NULL    |                | 
| status             | smallint(6) | YES  |     | 1       |                | 
| visible            | tinyint(1)  | YES  |     | 1       |                | 
| weight             | int(11)     | YES  |     | NULL    |                | 
| root               | tinyint(1)  | YES  |     | 0       |                | 
| mfr                | tinyint(1)  | YES  |     | 0       |                | 
+--------------------+-------------+------+-----+---------+----------------+

此表预计将有超过一千万条记录。预计架构不会发生太大变化。我需要检索列 f_id、children、status、visible、weight、root、mfr。

哪种数据检索方法更快?

1) Select * from WF where w_id = 1 AND status = 1;

我会在应用层去掉不必要的列。

2)Select children,f_id,status,visible,weight,root,mfr from WF where w_id = 1 AND status = 1;

没有必要像查询中预先选择的那样去除不必要的列。

有没有人有一个现实生活中的基准来判断哪个更快。我知道有人说 Select * 是邪恶的,但是 MySQL 在尝试获取整个块而不是检索选择性列时会更快地响应吗?

我使用的是 MySQL 版本:5.1.37-1ubuntu5 (Ubuntu),应用程序是 Rails3 应用程序。

【问题讨论】:

  • 你是拥有1000万条记录表的人;你能得到比你的基准多多少的真实生活?
  • 我正在迁移到 Rails。我无权访问当前的作品。从技术上讲,我现在没有数据。
  • @Jeff O 我希望你能获得点赞评论。这条评论说明了一切。
  • @p.campbell 等人:触发愉快的收官 - “重复”问题太笼统了,这个问题具有特定结构和卷以及特定 RDBMS (MySQL) 的特定场景。更不用说应用程序框架(Ruby)了。这个问题可以得到一个非常详细的具体答案
  • @p.c 我不同意。问题不是关于可维护性、健壮性、标准、(反)模式 - 它只是简单地放在Which approach is faster for data retrieval? 周围(C 领域)还有其他问题关于最快的方式来做某事,答案可能是 ASM(不漂亮C)这将是正确的答案。链接的“重复”正在讨论粗略的理论和最佳实践。

标签: sql mysql ruby-on-rails database-design activerecord


【解决方案1】:

作为一个包含列子集的 select 语句如何显着加快速度的示例,它可以在仅包含这些列的表上使用覆盖索引,从而有可能提高查询性能。

【讨论】:

  • 支持提及覆盖索引。我是来这么说的。
  • 谢谢,得到关于覆盖索引的要点。
  • @papdel 此查询的覆盖索引将占用 8 个(共 12 个)列,并且维护起来非常昂贵(相对而言)
  • 谢谢理查德。我对突然的强烈反对感到太兴奋了!
  • @Richard,这取决于插入查询的比率。如果查询的数量远远超过插入的数量,即使是 12 个覆盖索引中的 8 个也是值得的。另外,12 列中的 8 列是一个例子,我对一般问题给出了一般性答案。
【解决方案2】:

如果您返回的列越少,通过网络传输的数据就越少,数据库要处理的数据也就越少,而且它几乎总是会更快地返回。使用 select * 数据库也往往会变慢,因为数据库必须找出列是什么,因此比您指定时做的工作更多。如果结构发生显着变化,则进一步的 select * 通常会返回错误的结果。它最终可能会显示您不希望他们看到的用户字段,或者如果有人愚蠢地重新排列列,那么应用程序实际上可能会以错误的顺序显示事物,或者如果从数据中插入,请放他们在错误的列。在生产代码中使用 selct * 几乎是一种糟糕的做法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多