卡桑德拉新手在这里。 Cassandra v 3.9。
我正在为旅行者航班登机数据建模。
我的主要查询标准是搜索具有日期范围(最多7天窗口)的旅行者。
以下是我对Cassandra的有限接触所得出的结果。
create table IF NOT EXISTS travellers_checkin (checkinDay text, checkinTimestamp bigint, travellerName text, travellerPassportNo text, flightNumber text, from text, to text, bookingClass text, PRIMARY KEY (checkinDay, checkinTimestamp)) WITH CLUSTERING ORDER BY (checkinTimestamp DESC)
每天,我预计会有多达一百万条记录 - 导致分区有一百万条记录。
现在我的用户希望搜索日期窗口是必需的(最多一周的窗口)。在这种情况下,我应该使用跨越多个分区的IN子句吗?这是正确的方法还是应该考虑重新建模数据?或者,我也想知道发出7个查询(每天)并合并回复是否有效。
答案 0 :(得分:2)
您的数据模型似乎很好。但是如果您可以向分区键添加更多字段,它将很好地扩展。您应该使用带有executeAsync
的单独查询如果您正在使用in子句,这意味着您正在等待这个单个协调器节点给您一个响应,它将所有这些查询及其响应保留在堆中,如果其中一个查询失败,或者协调员失败,你必须重试整个事情
不使用IN子句,而是使用每天的单独查询并使用executeAsync执行它。
Java示例:
PreparedStatement statement = session.prepare("SELECT * FROM travellers_checkin where checkinDay = ? and checkinTimestamp >= ? and checkinTimestamp <= ?");
List<ResultSetFuture> futures = new ArrayList<>();
for (int i = 1; i < 4; i++) {
ResultSetFuture resultSetFuture = session.executeAsync(statement.bind(i, i));
futures.add(resultSetFuture);
}
for (ResultSetFuture future : futures){
ResultSet rows = future.getUninterruptibly();
//You get the result set of each query, merge them here
}