我正在使用ScyllaDb,但我认为这也适用于Cassandra,因为ScyllaDb与Cassandra兼容。
我有下面的表(我有~5个这样的表):
create table batch_job_conversation (
conversation_id uuid,
primary key (conversation_id)
);
这是一个批处理作业用来确保一些字段保持同步。在应用程序中,可以发生很多并发的写/读。偶尔,我会用一个批处理作业来纠正这些值。
同一行可能会发生大量写入操作,因此它将覆盖这些行。批处理作业当前使用以下查询选取行:
select * from batch_job_conversation
然后批处理作业将读取该点的数据,并确保一切同步。我认为这个查询不好,因为它给所有分区和节点协调器带来了压力,因为它需要访问所有分区。
我的问题是,对于这类表,是否有一个固定字段更好?类似于:
创建表格batch_job_conversation(总是零整数,会话标识uuid,主键((总是零),会话标识));
那么查询将是这样的:
select * from batch_job_conversation where always_zero = 0
对于每个批处理作业,我可以使用不同的分区键。这些表中的行数大小大致相同(最多几千行)。这些表可能会多次覆盖同一行。
有一个固定的值更好吗?有没有其他的方法来处理这个问题?我没有可以使用的逻辑分区键。
1条答案
按热度按时间9wbgstp71#
第二个模型将创建一个大分区,相信我,你不会想要这样的;- )(你会在大分区的上面做分区扫描,这比原来的完全扫描更糟糕)(还有另一个建议-保持你的分区很小,有很多分区,那么你所有的CPU都会被平等地使用)
第一种方法是可以的--称为“完全扫描”,但您需要正确管理它,有几种方法,我们在https://www.scylladb.com/2017/02/13/efficient-full-table-scans-with-scylla-1-6/中对此进行了博客,基本上可以归结为分治
还应注意spark也执行全扫描
第h行