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

时间:2011-02-16 18:28:48

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

  

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

可能是数据库nOOb问题。

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

TABLE 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应用程序。

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:0)

如果返回的列数较少,则通过网络传输的数据较少,数据库处理的数据较少,而且几乎总是返回更快。使用select *数据库也往往会变慢,因为数据库必须弄清楚列是什么,因此比指定时做更多的工作。如果结构发生显着变化,进一步选择*通常会返回不良结果。最终可能会显示您不喜欢的用户字段;或者希望他们看到或者有人傻到重新排列列,然后应用程序实际上可能显示错误的顺序或者从数据中插入,放入他们在错误的栏目中。在生产代码中使用selct *几乎是一种不好的做法。