【问题标题】:Is selecting fewer SQL columns making the request faster? [duplicate]选择更少的 SQL 列是否会使请求更快? [复制]
【发布时间】:2014-02-12 19:21:58
【问题描述】:

我有一个处理大量 SQL 查询的 rails/backbone 单页应用程序。

这是请求吗:

SELECT * FROM `posts` WHERE `thread_id` = 1

比这个更快:

SELECT `id` FROM `posts` WHERE `thread_id` = 1

选择未使用的列对查询执行时间的影响有多大?

【问题讨论】:

  • 速度较慢。更多数据必须从数据库传输到运行查询的应用程序。

标签: sql


【解决方案1】:

出于所有实际目的,在查找单行时,差异可以忽略不计。随着结果行数的增加,差异可能会变得越来越重要,但只要 您在 thread_id 上有一个索引,并且您不超过所有行的 10-20%表,这里仍然不是什么大问题。仅供参考,差异因素来自这样一个事实,即选择 * 将强制,对于每一行,在主索引中进行额外的查找。只选择id,只要在thread_id上查找二级索引就可以满足。

还有与任何大型字段相关的明显成本,例如 BLOB 文档或大型测试字段。如果posts 字段的值测量为数十 KB,那么显然检索它们会增加额外的传输成本。

所有这些都假设一个正常的执行引擎,具有 B-Tree 或 ISAM 行模式存储。几乎所有的“表”和引擎都属于这一类。如果您谈论的是列式存储,那么差异将是显着的,因为列式存储仅读取感兴趣的列,并且读取额外的列不必要地影响更明显的此类存储引擎。

thread_id 上有或没有索引将产生更加明显的影响。确保你拥有它。

【讨论】:

    【解决方案2】:

    选择更少的列通常会更快。不幸的是,很难确切地说时差会有多大。它可能取决于诸如有多少列以及其中包含哪些数据(例如,大型 CLOBS 可能需要比简单整数更长的时间来获取)、已设置的索引以及您和数据库服务器之间的网络延迟等因素.

    对于时差的确切答案,我能说的最好的方法是同时查询并查看每个查询需要多长时间。

    【讨论】:

      【解决方案3】:

      会有两个部分:查询时间和I/O时间(你也可以把I/O分解成server I/O 和服务器-客户端(网络)I/O)。

      仅选择一列在这两个方面都会更快 - 当然是因为要获取和传输的数据较少,而且还因为相关列可能是用于查找数据,因此服务器可能不必查找实际的数据页 - 它可能能够直接从索引中提取数据。

      【讨论】:

      • 你的意思是thread_id & id 在同一个综合索引中吗?
      • 可能,或者thread_id上的索引INCLUDEs id(取决于服务器软件)
      【解决方案4】:

      对于您的应用程序而言,性能差异几乎可以肯定是微不足道的。试一试,看看你是否能发现差异;尝试非常简单。

      【讨论】:

        猜你喜欢
        • 2010-09-11
        • 2021-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-29
        • 2021-01-18
        • 2017-02-13
        相关资源
        最近更新 更多