选择更少的 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
上的索引INCLUDE
s id
(取决于服务器软件)【参考方案4】:
对于您的应用程序而言,性能差异几乎可以肯定是微不足道的。试一试,看看你是否能发现差异;尝试非常简单。
【讨论】:
以上是关于选择更少的 SQL 列是不是会使请求更快? [复制]的主要内容,如果未能解决你的问题,请参考以下文章