【问题标题】:Is it costly to read one full partition from Cassandra?从 Cassandra 读取一个完整的分区成本高吗?
【发布时间】:2020-05-15 08:28:23
【问题描述】:

假设我只有一张桌子

RecordingsByAccountaId (AccountId, a,b,c,x,y,z)

分区键:AccountId 聚类键:a,b

我需要在我的代码中为一个帐户获取数据,所以执行

Select * from RecordingsByAccountaId where accountId = 'accountId';

这是一项昂贵的操作吗???

目标是更新此表的 2-3 行,但我没有任何信息,然后是 accountId。

查询一行或整个分区几乎一样吗?因为我看到在 200 行和一行之间获取的时间相差 20-30 毫秒?

【问题讨论】:

    标签: database cassandra cassandra-2.0 cassandra-3.0


    【解决方案1】:

    这主要取决于分区的大小——它包含多少行。另一个因素是您的分区的碎片化程度——它是位于单个 SSTable 中(已压缩)还是位于多个 SSTable 中,因此您将从多个文件中读取数据。

    但通常情况下,读取单个文件内的分区是顺序操作,因为属于同一分区的所有行都是顺序写入的,如果分区大小不是很大,那么性能应该不会受到太大影响(但这也可能取决于您的硬件)。

    附:您如何决定要更新哪些行?

    【讨论】:

    • 此查询:select * from RecordingsByAccountaId where AccountId = 123 and a =1 and b = 2; 是否将整个分区拉入内存,然后将请求的单行返回或仅将单行读取到内存并返回该行?
    • 如果它是完整的主键,就像你的情况一样,那么它只会读取一行......但它可能需要从多个文件中读取数据以重建最新版本,如果部分更新的行。
    • 我们如何计算来自单个或多个 SSTable 的数据?直到什么程度/配置我们可以说它工作正常?分区大小仅处于良好状态,小于 100MB。
    • 这取决于您是只是插入数据还是更新数据等。最终,通过压缩,数据将被合并到更少的文件中。
    • 如果您查看nodetool tablehistograms,它将显示该节点上该表每次读取的 sstables 百分位数。这不会向您显示特定的行,但可以让您了解表中数据的碎片化程度。如果每次读取的 p50 sstables 很高,那么您的性能将会下降。此外,要查看为特定查询读取的 sstables,您可以查看 cqlsh 中的跟踪。运行tracing on 然后执行您要分析的查询。它将显示每个副本咨询了多少个 sstable。
    猜你喜欢
    • 2018-06-07
    • 2021-11-12
    • 2016-07-19
    • 2021-04-22
    • 1970-01-01
    • 2021-08-24
    • 2019-11-26
    • 1970-01-01
    • 2018-05-27
    相关资源
    最近更新 更多