选择*sql query vs选择特定列sql查询

pap*_*del 5 mysql sql activerecord database-design ruby-on-rails

可能重复:
为什么SELECT*被认为有害?

可能是一个数据库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       |                | 
+--------------------+-------------+------+-----+---------+----------------+
Run Code Online (Sandbox Code Playgroud)

该表预计将超过一千万条记录.模式预计不会发生太大变化.我需要检索列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应用程序.

Mic*_*eyn 5

作为包含列子集的select语句如何显着更快的示例,它可以在表上使用仅包含那些列的覆盖索引,从而可能产生更好的查询性能.


HLG*_*GEM 0

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