2011-02-16 92 views
4

可能重复:
Why is SELECT * considered harmful?SELECT * SQL查询VS选择特定的列SQL查询

可能是一个数据库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,儿童,状态,可见,重量,根,制造商。

哪种方法对数据检索更快?

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

+7

你是拥有1000万记录表的人;你能获得比你的基准更多的现实生活吗? – JeffO 2011-02-16 18:31:26

+0

我正在向Rails进行迁移。我没有获得目前的生产。从技术上讲,我现在没有数据。 – papdel 2011-02-16 18:32:50

回答

0

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

5

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