让我们考虑这两个表...
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中,则选择了所需的列。
答案 0 :(得分:4)
第二个查询的性能可能比第一个查询慢,但这实际上取决于几个因素:
set
中的条目数-不建议在集合类型中存储数百个元素; 如果您从不对数据进行部分更新,则可以使用frozen<set<text>>
-在这种情况下,set的所有数据将存储在一起并立即读取,避免在多个SSTables中搜索(尽管可能会在所有SSTable中搜索其他字段。
此外,请考虑到,如果您持续执行该查询,则最好不要像显示的那样使用SchemaBuilder,而最好使用prepare query once and then bind variables into it for execution-在这种情况下,服务器不会不能对每个请求重新解析CQL查询。