cassandra:加载表的部分列性能

6ljaweal  于 2021-06-14  发布在  Cassandra
关注(0)|答案(1)|浏览(425)

让我们考虑一下这两张table。。。

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中内部加载,则会选择所需的列。

fv2wmkja

fv2wmkja1#

第二个查询的性能可能比第一个慢,但这实际上取决于几个因素:
列表中的条目数 set -不建议在集合类型中存储超过数百个元素;
文本条目的大小;
您是一次性存储数据,还是定期更新集合中的条目—在这种情况下,同一分区的数据可能驻留在需要读取的多个sstable中。
如果从未对数据进行部分更新,则可以使用 frozen<set<text>> -在这种情况下,集合的所有数据将存储在一起并一次读取,避免在多个sstable中搜索(尽管它可能在所有sstable中搜索其他字段)。
另外,请考虑到,如果您正在连续执行该查询,那么最好不要像您所示那样使用schemabuilder,而是最好只准备一次查询,然后将变量绑定到其中以供执行—在这种情况下,服务器不会对每个请求重新解析cql查询。

相关问题