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