选择更少的 SQL 列是不是会使请求更快? [复制]

Posted

技术标签:

【中文标题】选择更少的 SQL 列是不是会使请求更快? [复制]【英文标题】: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

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

【问题讨论】:

速度较慢。更多数据必须从数据库传输到运行查询的应用程序。 【参考方案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】:

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

【讨论】:

以上是关于选择更少的 SQL 列是不是会使请求更快? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Spark SQL概述

mysql 优化

什么在 php 中更快:syslog、文件附加或 error_log

SQL 查询来自不同区域的选择行

《高性能MySQL》- 04 Schema与数据类型优化

减少查询中的资源使用