我们目前正在研究使用多个列族对我们的bigtable查询性能的影响。我们发现将列拆分成多个列族不会提高性能。有没有人有过类似的经历?Bigtable性能影响列族
关于我们的基准设置的更多细节。此时,我们生产表中的每行包含大约5列,每列包含0.1到1 KB的数据。所有列都存储在一个列族中。在执行行键范围过滤器(平均返回340行)并应用列正则表达式过滤器(每行只返回1列)时,查询平均需要23,3ms。我们创建了一些测试表,我们将每行的列/数据量增加了5倍。在测试表1中,我们将所有内容都保存在一个列中。正如预期的那样,这将相同查询的查询时间增加到40.6ms。在测试表2中,我们将原始数据保存在一个列族中,但额外的数据被放入另一个列族中。当查询包含原始数据的列族(因此包含与原始表相同数量的数据)时,查询时间平均为44.3ms。因此,使用更多色谱柱系列时,性能甚至会下降。
这与我们预期的完全相反。例如。这是在Bigtable的文档(https://cloud.google.com/bigtable/docs/schema-design#column_families)
分组数据提到的成列的家庭可以让你从一个家庭,或家庭的多重检索数据,而不是检索所有数据的每个一行。尽可能地将数据分组,以便在最频繁的API调用中获得所需的信息,但不能再多了。
任何人对我们的发现有解释吗?
(编辑:增加了一些更多细节)
单个行中的含量:
表1:
CF1
- COL1
- COL2
- ...
- col25
表2:
- CF1
-
个
- COL1
- COL2
- ..
- COL5
- CF2
- COL6
- COL7
- ...
- col25
我们使用转客户端执行的基准。调用API的代码看起来基本如下:
filter = bigtable.ChainFilters(bigtable.FamilyFilter(request.ColumnFamily),
bigtable.ColumnFilter(colPattern), bigtable.LatestNFilter(1))
tbl := bf.Client.Open(table)
rr := bigtable.NewRange(request.RowKeyStart, request.RowKeyEnd)
err = tbl.ReadRows(c, rr, func(row bigtable.Row) bool {return true}, bigtable.RowFilter(filter))
Hi @David,谢谢你的回复。我已经更新了一些关于行内容和我们正在执行的查询的更多细节。正如你所看到的,我们确实执行了一个FamilyFilter。在我们的基准测试中,我们通过在** cf1 **上应用FamilyFilter来获取** col1 **,然后执行与** col1 **完全匹配的ColumnFilter。所以我们希望对于表2来说,查询会更快,因为FamilyFilter会返回更少的数据。这个假设是不正确的? – krelst