Cassandra:加载表的部分列性能

时间:2019-06-16 13:26:35

标签: cassandra cassandra-3.0

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

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 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);

我想知道第二选择是否比第一选择更复杂。如果没有额外的开销。例如,如果将整个行(所有列)都内部装入了cassandra中,则选择了所需的列。

1 个答案:

答案 0 :(得分:4)

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

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

如果您从不对数据进行部分更新,则可以使用frozen<set<text>>-在这种情况下,set的所有数据将存储在一起并立即读取,避免在多个SSTables中搜索(尽管可能会在所有SSTable中搜索其他字段。

此外,请考虑到,如果您持续执行该查询,则最好不要像显示的那样使用SchemaBuilder,而最好使用prepare query once and then bind variables into it for execution-在这种情况下,服务器不会不能对每个请求重新解析CQL查询。