【发布时间】:2017-08-01 10:56:30
【问题描述】:
这是问题Why doesn't BigQuery perform as well on small data sets 的后续内容。
假设我有一个大约 1M 行的数据集。在我们使用(mysql)的当前数据库中,聚合查询运行速度非常慢,可能需要大约 10 秒左右的复杂聚合。在 BigQuery 上,所需的初始化时间可能使这个查询需要大约 3 秒,比在 mysql 中要好,但是如果我们需要在 1 秒或更短的时间内返回查询,则该工作的工具是错误的。
然后我的问题是,在对中等大小的数据集(例如 1-10M 行)进行聚合查询时,除了使用 BigQuery 之外,还有什么好的替代方法?一个示例查询可能是:
SELECT studio, territory, count(*)
FROM mytable
GROUP BY studio, territory
ORDER BY count(*) DESC
我想到的可能解决方案是 ElasticSearch (https://github.com/NLPchina/elasticsearch-sql) 和 Redshift(postgres 太慢)。在这里可以通过 SQL 查询的好选择是什么?
注意:我不是在寻找 why 或 如何 BQ 应该被使用,我正在寻找查询可以在 10M 行以下的数据集的替代方案在约 1 秒内返回。
【问题讨论】:
-
@David542 像 Redshift 和 Bigquery 这样的 OLAP 系统在构建时并不强调快速查询处理,这些系统常见的多秒甚至一分钟查询。有了你提到的数据量,你应该能够在 Redshift 之类的东西上实现它,但我很确定这种延迟会有多一致。也许您应该考虑不同的架构,例如放置一个缓存来提供分析查询的结果,然后安排定期运行您的查询以更新您的缓存。
-
@cpard 同意,在我们对“小”数据大小的 Redshift 进行的测试中,它始终表现更差,有时临时查询在第一次执行时会花费 20 多秒,请参阅docs.aws.amazon.com/redshift/latest/dg/c-query-performance.html。
-
@cpard,对,我们正在做 x3 基准测试,所以第一次会更长,但接下来的两次有编译查询。无论如何,这对我们的项目来说是一个杀手,因为大多数查询都是临时的,我们不能有免责声明,“别担心——你的查询需要 20 秒,但第二次运行它会更快!”
-
@David542 如果您不介意使用非 SQL 的查询语言,那么在有此类要求的情况下使用 Elastic Search 可能会更好。特别是如果您计划让多个并发用户运行查询。您知道 Redshift 的并发查询限制吗? docs.aws.amazon.com/redshift/latest/dg/…
-
@David542 我添加了一些我个人实际使用过的替代方案的答案。我对您的 Redshift 体验感到有些惊讶。您使用的是什么类型的节点和表结构?我们经常在我们的 SSD 节点上看到亚秒级的查询,无论之前是否有查询。
标签: mysql sql google-bigquery amazon-redshift