我对Cassandra中的主键如何允许快速数据访问感到困惑。例如,我用以下模式列创建了一个Student表:
我选择主键为学生ID。我的理解是,基于此值的一些哈希值,所有学生都将被放置在集群周围。说我还选择“国家”作为“聚类”列。因此,在学生的每个分区(根据其ID进行划分)中,将按国家(按字母顺序)对其进行排序。
因此,如果我随后想要检索特定国家/地区的所有学生,我是否必须访问集群中的多个节点?虽然已按国家/地区在每个节点上对学生进行了排序,但是没有什么可说特定国家/地区的所有学生都存储在同一节点上?甚至支持这种查询吗?
如果我仅将5个学生添加到5个节点的群集中,如果学生ID是UUID,是否有可能所有学生都存储在单独的节点上?
答案 0 :(得分:1)
因此,如果我随后想要检索特定国家/地区的所有学生,我是否必须访问集群中的多个节点?
是的
虽然在每个节点内按国家/地区对学生进行了排序,但没有什么可说特定国家/地区的所有学生都已存储在同一节点上?
正确。
甚至支持这种查询吗?
但是,这在Cassandra中被认为是反模式。发生的事情是,协调器(从客户端接收请求的节点)将不得不查询所有其他节点,因为它将必须扫描该列族的所有行。
如果我仅将5个学生添加到5个节点的群集中,如果学生ID是UUID,是否有可能所有学生都存储在单独的节点上?
是的
解决问题的方法是,在复制行时(创建时),每个查询都有一个列族(一个用于按学生ID选择,另一个用于按国家/地区选择,每个都有不同的主要查询)。一个学生,您必须将其插入两个列系列中。