可能是数据库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应用程序。
答案 0 :(得分:5)
作为包含列子集的select语句如何显着加快的示例,它可以在表上使用仅包含这些列的覆盖索引,从而可能产生更好的查询性能。
答案 1 :(得分:0)
如果返回的列数较少,则通过网络传输的数据较少,数据库处理的数据较少,而且几乎总是返回更快。使用select *数据库也往往会变慢,因为数据库必须弄清楚列是什么,因此比指定时做更多的工作。如果结构发生显着变化,进一步选择*通常会返回不良结果。最终可能会显示您不喜欢的用户字段;或者希望他们看到或者有人傻到重新排列列,然后应用程序实际上可能显示错误的顺序或者从数据中插入,放入他们在错误的栏目中。在生产代码中使用selct *几乎是一种不好的做法。