如果在一个特定的列族上,我稍后会在列上添加索引,它会对历史数据或添加索引后的数据进行索引吗。
在这里,Cassandra DB在更新列作为辅助索引后什么时候索引数据公认的答案是,它将只对创建索引后插入的数据进行索引。
我尝试在列上创建一个具有索引的CF。(我使用的是Cassandra 1.0.7)
使用comparator=UTF8Type创建列族用户并且column_metadata=[{column_name:full_name,validation_class:UTF8Type},{column_name:birth_date,validation_class:LongType,index_type:KEYS},{column_name:state,validation_class:UTF8Type,index_type:KEYS}];
添加了一些数据,然后进行
删除索引用户删除的索引。birth_date然后通过更新CF 将其添加回来
使用comparator=UTF8Type更新列族用户并且column_metadata=[{column_name:full_name,validation_class:UTF8Type},{column_name:birth_date,validation_class:LongType,index_type:KEYS},{column_name:state,validation_class:UTF8Type,index_type:KEYS}];
然后再次添加一些数据
但是当我查询birth_data时,我也会得到历史数据吗?
有人能澄清我对此的困惑吗?是否有两种创建索引的方法,一种使用历史数据,另一种不使用?
也许以前版本的Cassandra没有为历史数据建立索引,但根据Cassandra 1.2后的代码,如果添加辅助索引,索引创建是一个异步过程,它确实会在历史数据上发生:
https://github.com/apache/cassandra/blob/cassandra-1.2.15/src/java/org/apache/cassandra/db/index/SecondaryIndexManager.java#L240
在您的场景中,您删除了索引并添加了索引。因为旧的索引文件已经加载,而没有从磁盘中删除,Cassandra将它们链接起来以便再次使用。否则,它会试图创建它们。
如果你不确定你的二级索引是否同步,你可以使用:
nodetool rebuild_index