SELECT *真的比只选择所需的列需要更多的时间吗?

时间:2014-03-13 17:00:13

标签: mysql sql performance select

它会在网站页面加载时产生明显的差异吗?平均而言,我的表有10列,如果我只需要其中3列,我是否应该在查询中调用它们以使其更快?

7 个答案:

答案 0 :(得分:8)

是否会产生可辨别的差异。可能不是在大多数情况下。以下是一些可能产生重大影响的案例:

  • 7个不需要的列非常非常大。
  • 你要返回很多很多行。
  • 你有一个大表,有很多行,并且3列上有索引,但不是10。

但是,还有其他原因不使用*

  • 它将在编译查询时根据数据库中列的顺序替换列。如果表的结构发生变化,这可能会导致问题。
  • 如果列名更改或删除,您的查询将起作用,后续代码可能会中断。如果明确列出列,则查询将中断,使问题更容易发现。
  • 键入三个列名称不是一件大事。明确列出列使代码更具信息性。

答案 1 :(得分:2)

是的,如果您只需要一些列,只选择那些。以下是一些原因:

  1. 最明显的事情:需要发回额外的数据,以便传输更大的数据包(或通过本地套接字管道传输)。这将增加整体延迟。这对于1行或2行似乎不太多,但要等到你有100行或1000行... 7个额外的数据列将显着影响整体传输延迟,特别是如果你最终必须打破结果集更多TCP数据包用于传输。如果您正在访问localhost套接字,但是将数据库移动到网络上的服务器,移动到另一个数据中心等,这可能不是一个问题...而且影响将是白天的!
  2. 启用MySQL查询缓存后,将不需要的数据存储在结果集中会增加您的缓存空间需求 - 较大的查询缓存可能会遭受性能下降。
  3. 可能会出现巨大影响:如果您只需要覆盖索引中的列,那么执行select *将需要对主要内容中的其余数据字段进行后续点查找表而不仅仅是使用索引表中的数据。

答案 2 :(得分:2)

假设您有一个包含1000列的表,而您只需要3列。

您认为什么会跑得更快?为什么?

这:SELECT * FROM table_name;

或者:SELECT col1, col2, col3, FROM table_name;

当您使用*时,您现在正在内存中保留整个选择(大或小)。选择越大......它将要使用/需要的内存越多。

因此,即使您的表格不一定很大,我仍然只会选择您实际需要的数据。你甚至可能没有注意到速度的差异,但它肯定会更快。

答案 3 :(得分:1)

是的,你应该。

在select中使用命名列是使用数据库的最佳做法,原因有很多。

只有所需的数据才能从数据库传输到应用服务器,从而减少CPU,内存和磁盘的使用。

它有助于检测编码错误和结构变化。

使用select *时只有少数情况是个好主意,在所有其他查询中帮自己一个忙,并使用列名。

答案 4 :(得分:0)

缺点是肯定的,如果要返回更多数据,则需要更长时间。这可能是非常非常非常短的时间,但是它需要更长的时间。如上所述,select *在您可能不是设计/实现数据库的生产环境中可能是危险的。如果您假定按特定顺序返回列,或者数据库结构属于特定类型,然后DBA进入并进行某种更改而不通知您,则可能是您的代码存在问题。

答案 5 :(得分:0)

差异非常小,但存在细微差别,我认为这实际上取决于几个因素更快。

1)表格中有多少列?

2)您实际需要抓多少列?

3)你抓了多少条记录?

在你的情况下,根据你所说的有10列并且只需要其中3列的内容,我怀疑如果你使用'Select *',它会有所作为,除非你是&#39 ;抓住成千上万的记录。但是在涉及更多列的更极端的情况下,我发现'Select *'略快一些,但在所有情况下都可能不是这样。

我曾经在一个包含超过150列的SQLite表中进行过一些速度测试,我只需要抓取大约40列,而且我需要所有20,000多条记录。速度差异非常小(我们说的是20到40毫秒之间的差异),但实际上从'SELECT ALL *'的所有列中获取数据实际上更快,而不是'Select All Field1, Field2, etc'

我假设你的表中记录和列越多,这个例子的速度差就越大。但如果你只需要在一张巨大的表格中只需要3列,我猜想只抓住这3列会更快。

但最重要的是,如果您真的关心'Select *''Select field1, field2, etc'之间的最小速度差异,那么请进行一些速度测试。

答案 6 :(得分:0)

肯定是的。 *将替换为所有列名称。之后只执行开始。例如,如果表中有3列a,b,c,则选择a,b,c直接开始执行,其中select *开始将查询转换为select a,b,c之后仅执行统计数据。