仅查询特定列是否更快?

时间:2015-03-31 20:03:17

标签: mysql sql performance select

我听说手动选择列的速度更快(" col1,col2,col3等等#34;)而不是用" *"查询它们。

但是,如果我甚至不想查询表格的所有列,该怎么办?查询更快,例如,#col; col2,col2" insteaf of" col1,col2,col3,col4"?

根据我的理解,SQL必须搜索所有列,只返回结果更改。我想通过选择合适的列来了解我是否可以获得性能提升。

(我还是这样做,但是我的一个应用程序的后端API返回的频率高于非所有列,因此我考虑让用户手动选择他想要的列)

4 个答案:

答案 0 :(得分:6)

通常,减少select中的列数是次要优化。这意味着从数据库服务器向调用服务器的应用程序返回的数据较少。更少的数据通常更快。

在大多数情况下,这是一个小小的改进。在某些情况下,改进可能更重要:

  • 如果覆盖索引可用于查询,则索引无需访问数据页即可满足查询。
  • 如果某些字段很长,那么记录会占用多个页面。
  • 如果检索的数据量只占每条记录中整体数据的一小部分(比如<10%)。

单独列出列是个好主意,因为它可以保护代码免受底层架构的更改。例如,如果更改了列的名称,则显式列出列的查询将以易于理解的错误中断。这比运行并产生错误结果的查询更好。

答案 1 :(得分:2)

您应该尽量不要使用select *

  • 将数据移动到使用者身份的效率低。当您选择SELECT *时,您经常从数据库中检索比您的应用程序真正需要的功能更多的列。这会导致更多数据从数据库服务器移动到客户端,从而减慢访问速度并增加计算机负载,并且需要更多时间在网络上传输。当有人向基础表添加新列时,尤其如此,当原始使用者对其数据访问进行编码时,这些列不存在且不需要。

  • 索引问题。考虑一种您希望将查询调整为高性能的方案。如果您要使用*,并且它返回的列数超过您实际需要的数量,那么服务器通常必须执行更昂贵的方法来检索您的数据。例如,你将无法创建一个仅覆盖SELECT列表中的列的索引,即使你做了(包括所有列[ shudder ]),下一个来到这里的人并且在基础表中添加了一列会导致优化器忽略您的优化覆盖索引,并且您可能会发现查询的性能会因为没有明显原因而显着下降。

  • 绑定问题。当您选择SELECT *时,可以从两个不同的表中检索两个同名的列。这通常会使您的数据使用者崩溃。想象一下连接两个表的查询,这两个表都包含一个名为“ID”的列。消费者如何知道哪个是哪个?当基础表结构发生变化时,SELECT *还会混淆视图(至少在某些版本的SQL Server中) - the view is not rebuilt, and the data which comes back can be nonsense。而最糟糕的部分是,您可以随心所欲地为您的列命名,但是下一个出现的人可能无法知道他必须担心添加会与您已开发的列发生冲突的列名。

我是从this回答得到的。

答案 2 :(得分:1)

我相信这个话题已经在这里讨论了:

select * vs select column

我相信它也涵盖了你的担忧。请看一下。

答案 3 :(得分:1)

所有列标签和值都占用一些空间。将它们发送到请求的发布者而不是列的子集意味着发送更多数据。发送的数据越来越慢。

如果你有专栏,比如 idusernamepasswordemailbiourl

并且您只想获得usernamepassword,然后

select username, password ...

select * ...

因为idemailbiourl也会被发送给后者,这会使响应更大。但select *的主要问题是不同的。如果由于某种原因列的顺序发生变化,则可能是不一致的来源。此外,它可能会检索您不想检索的数据。最好使用您想要检索的列的白名单。