2011-08-27 38 views
4

可能重复:
Which is faster/best? SELECT * or SELECT column1, colum2, column3, etcMySQL的选择性能

我有一个关于MySQL的性能问题。在开始之前,我为我的坏英语感到抱歉。

这是一个问题:星号和字段名之间用逗号分隔的性能差异是什么。

例如:a在名为“example_table”的表中有一个表和名为“f1,f2,f3,f4,f5”的5个字段。

select * from `example_table`; 

select f1, f2, f3, f4, f5 from `example_table`; 

感谢的答复。

+1

我知道这是一个骗局,但似乎SO不允许你搜索'*' –

+0

我的同事在数据库管理方面比我好得多,总是告诉我不要使用'SELECT *',因为它需要比表示需要的时间多得多的时间...... – Marco

回答

4

如果您选择所有字段,则不会有可测量的性能差异。

这提高了代码的可读性,因为您确切知道查询将返回哪些字段。

如果你没有选择所有的字段,第二种形式的性能会略好,因为MySQL将在网络上发送更少的数据。

如果表中包含TEXT或BLOB列,并且您不要求这些列,则这可能会导致磁盘读取次数减少。这些类型不是直接存储在行中,所以这会避免一些额外的磁盘读取。

但是,如果您选择所有字段,则不会有可测量的性能差异。

+0

OP讨论的是在SELECT *和显式选择所有列之间进行选择的情况。 –

3

执行此查询时不会有性能差异;这两个查询是等价的。都选择表中的所有列。

它可能会采取一些额外的纳秒解析只是因为有更多的字符来解析第二个查询,但不会造成任何显著(甚至衡量)的区别。

但是,考虑如果稍后将额外的列添加到表中,会发生什么情况。如果原始查询中不需要此列,则它仍将投影到查询中并传输到调用应用程序。这可能确实会在应用程序中造成可观的放缓。因此,仍建议仅选择所需的列。 (如果你正在编写代码来显示整个数据库表,那么*当然是合适的,因为的任务是“获取表中的所有列”。)

+0

我认为@ arnaud576875是正确的,如果一个表包含很多字段并且用户只需要一些... – Marco

+1

他在这种情况下是正确的,但这不是OP询问的场景。 – cdhowie

+0

哦,你是对的,我没有注意到example_table只有五个字段。好的,你说得对! :) – Marco