【问题标题】:select * vs select column in Redshift and MySql在 Redshift 和 MySql 中选择 * vs 选择列
【发布时间】:2018-10-16 20:53:18
【问题描述】:

如果我只需要 2/3 列并查询 SELECT * 而不是在选择查询中提供这些列,那么 Redshift 和 MySql 中的更多/更少 I/O 或内存是否会导致性能下降?

基本上我想了解在 Redshift 和 MySql 中比较 select *select column 在哪个数据库中哪个查询更快,为什么??

【问题讨论】:

  • 这里有很多问题(I/O、内存、速度)。您自己尝试过或分析过任何东西吗?不过,您肯定有一个正确的预感,因为 RedShift 存储通常是柱状的。事实上,RedShift docs 是这样说的:“您可以通过以压缩的、分区的、列式数据格式存储数据来提高查询性能并降低成本……如果您以 Parquet 或 ORC 等列式格式存储数据,您的由于 Redshift Spectrum 仅扫描查询所需的列,费用也会下降。”
  • 我希望两者具有相同的执行计划,因此在数据库本身上,性能应该非常相似。另一方面,如果select * 与仅在几列上进行选择相比,会导致发送更多的数据,那么从网络带宽的角度来看,前者的性能会更低。
  • @TimBiegeleisen@RayToal 感谢您的回复,我知道 SELECT * 总是很昂贵,因为它需要更多的 I/O、内存、处理更多的数据等,但基本上我想了解不同的查询执行在列数据库和行数据库中。
  • 你可能错过了我评论的重点。我想告诉你,这两个查询的执行策略可能是相同的。但是,如果您想要更多的列,那么肯定会存在性能差异,尤其是在额外的列特别大的情况下。
  • 总是只选择你真正想要返回的列——即使那是全部。不要使用邪恶的 SELECT *。

标签: mysql performance bigdata amazon-redshift rdbms


【解决方案1】:

由于 RedShift 是列式数据库,

Select Column1,Clumn2 from table_a where some_criteria

特定列选择查询将超快,因为 Redshift 只需扫描/读取特定列。

而 Select * 会慢得多,因为 Redshift 需要扫描和读取所有列。

如果是 MySql,从 table_a 中选择 col1,col2 也可以(因为内存/IO 更少),但不如 Redshift。

我建议您阅读一些关于 Redshift 等列式数据库的非常好的文档,它的分布键概念和编码概念同时也极大地影响了性能。

https://www.youtube.com/watch?v=iuQgZDs-W7A

【讨论】:

    【解决方案2】:

    对于 MySQL,可能会有很小或很大的差异:

    • Large:如果*TEXTBLOB 列,这些列不存在于2/3 中。这是因为在某些情况下,此类字段需要额外的磁盘命中才能获取。
    • 否则小。 (更多的解析,更多的分配内存等等)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-05
      • 2012-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-20
      相关资源
      最近更新 更多