我搞不懂cassandra中的主键是如何允许快速数据访问的。例如,我创建了一个包含以下模式列的学生表:
我选择主键作为student id。我的理解是,所有的student都将基于这个值的一些散列放在集群周围。假设我也选择国家作为聚类列。因此,在每个学生分区内(根据id划分),他们将按国家(大概按字母顺序)排序。
因此,如果我想检索特定国家的所有学生,我需要访问集群中的多个节点吗?虽然每个节点中的学生都是按国家/地区排序的,但没有任何迹象表明特定国家/地区的所有学生都存储在同一个节点上?是否支持这种类型的查询?
如果我只向一个5节点集群添加了5个学生,那么如果学生id是uuid,那么所有学生是否都可能存储在单独的节点上?
1条答案
按热度按时间gz5pxeao1#
因此,如果我想检索特定国家的所有学生,我需要访问集群中的多个节点吗?
对。
虽然每个节点中的学生都是按国家/地区排序的,但没有任何迹象表明特定国家/地区的所有学生都存储在同一个节点上?
对的。
是否支持这种类型的查询?
是的,但这在Cassandra被认为是反模式的。协调器(从客户机接收请求的节点)必须查询所有其他节点,因为它必须扫描该列族的所有行。
如果我只向一个5节点集群添加了5个学生,那么如果学生id是uuid,那么所有学生是否都可能存储在单独的节点上?
对。
解决问题的方法是,在复制行的同时,为每个查询设置一个列族(一个用于按学生id选择,另一个用于按国家/地区选择,每个列具有不同的主查询)(创建学生时,必须将其插入两个列族中)。