Cassandra:加载 table 列性能的一部分

Cassandra: Loading part of table's columns performance

让我们考虑这两个表...

CREATE TABLE IF NOT EXISTS lp_operations.campaign_changed (
  oe text,               // owner email                  
  ud timestamp,          // updated
  PRIMARY KEY((oe))
);

CREATE TABLE IF NOT EXISTS lp_operations.campaign_data (
  oe text,              // owner email
  kp set<text>,         // each text in set is serialized object in JSON
  ud timestamp,         // updated
  PRIMARY KEY((oe))
);

如果我们假设行数和包含的 "oe"、"ud" 值相同。是否在 Cassandra 的相同性能水平下跟踪两个 select?

Select select1 = select().all().from("lp_operations", "campaign_changed").where(eq("oe", email)).limit(1);
CampaignChanged obj1 = cas.selectOne(select1, CampaignChanged.class);

Select select2 = select().column("oe").column("ud").from("lp_operations", "campaign_data").where(eq("oe", email)).limit(1);
CampaignData obj2 = cas.selectOne(select2, CampaignData.class);

我想知道第二个 select 是否比第一个复杂。如果没有额外的开销。例如,如果整行(所有列)在 cassandra 内部加载,因此选择了所需的列。

第二个查询的性能可能比第一个慢,但这实际上取决于几个因素:

  • set 中的条目数 - 不建议在集合类型中存储超过数百个元素;
  • 文本条目的大小;
  • 您是一次性存储数据,还是定期更新集合中的条目 - 在这种情况下,同一分区的数据可能驻留在需要读取的多个 SSTable 中。

如果你从来不做数据的部分更新,那么你可以使用frozen<set<text>> - 在这种情况下,set的所有数据将存储在一起并立即读取,避免在多个SSTables中搜索(虽然它可能会在所有 SSTable 中搜索其他字段)。

此外,请注意,如果您连续执行该查询,那么最好不要使用 SchemaBuilder, like you shown, but better to prepare query once and then bind variables into it for execution - 在这种情况下,服务器不会 re-parse CQL 查询每个请求.