2010-11-17 35 views

回答

15

SELECT字段比选择*更快。

因为如果你在你的表有超过1场/列,然后选择*将返回所有这些的,这需要网络带宽更多的数据库工作,以获取所有其他领域。但是如果您只需要一个字段/列,数据库负载就会减少,并且不需要传输不需要的信息,从而不必要地占用带宽资源。

+0

我会赞成你,但我认为你没有真正回答这个问题。他试图避免做出假设并接受罐头智慧。我认为他想看基准数字;我也做。这可以解释为什么他还没有接受你的答案,尽管所有的赞扬。 – 2010-11-18 14:57:13

+0

在对同样的问题的另一个答案中提出了其他几个好处,我认为这个问题罐头智慧是正确的。我能想到的唯一好处是如果你懒惰,不想写出所有的列......对于基准测试,您可以像在另一个线程中提到的那样,自己尝试一下,直到数据库的命令出现为止。 – rapadura 2010-11-18 23:36:13

+0

我没有足够大的数据集来衡量差异。我可以伪造一些数据并衡量它,但是我刚刚测量了fakery。我正在监测这个问题,看看是否有人会在实际系统上测量实际数据时提出明确的答案。 *我可以从中学到一些东西。我已经读过罐头的智慧。现在告诉我一些我不知道的事情。 – 2010-11-19 00:19:56

4

Select *据说比select <field list>慢,因为*需要额外的查找来获取所有列。
此外,如果该表包含更多列(您不感兴趣),为什么只让他们忽略它们?

1

既然你提到mysql,我只是测试“SELECT字段”是更快的。你为什么不自己测试一下呢?

在Linux上:

time (echo "SELECT * FROM table" | mysql -u username --password=passwd database > /dev/null) 

time (echo "SELECT field FROM table" | mysql -u username --password=passwd database > /dev/null) 
+0

谢谢 - 我没有工作中的本地开发环境,我知道不专业。感谢您向我展示如何在Linux中测试这些内容。我有很多比较,我想优化我的查询。 – liamfriel 2010-11-17 11:01:21

+0

然后,我会说,你必须得到的第一件事是本地开发环境:) – Simone 2010-11-17 11:03:49

+0

不要执行列出的命令,因为它们将在你的bash历史记录中以明文结束。 – 2013-04-02 20:04:57

2

SELECT * 将检索这可能是非常大的,特别是如果你有斑点的所有列。 黄金法则是选择你需要的字段。

5

除了@ AntionoP的回答,使用SELECT field的另一个好处是,如果字段被索引,MySQL可以直接从索引返回值,而无需查找数据行以获取结果。

+0

直接来自索引的任何引用,而不需要查找数据行以获得结果。 – ajreal 2010-11-17 12:29:44

+0

@ajreal - 这个链接引用了这个事实:http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html – 2010-11-17 20:19:06

+0

如果您的查询有,这只是真实的(或有意义的)一个'WHERE'子句,并且匹配标准与索引具有相同的形式。也就是说,查询类似于'select field from table'或'select field where from field where'LIKE'foo%''需要一个完整的列扫描,所以查询索引列无关紧要。 – 2010-11-18 15:03:19

1

当嵌套查询使用SELECT *,有时查询优化器会删除你不这样做的领域用于后续查询。所以在这种情况下,这并不重要。但是你相信MySQL的查询优化器吗?要确定SELECT *是否将不必要的字段添加到查询计划中,唯一的方法是直接使用EXPLAIN (..query..)输出它们来比较两个查询计划。

也就是说,最简单的方法是确实肯定是不会在生产查询中使用SELECT *

相关问题