Cassandra中的列太多

Cassandra中的列太多,cassandra,cassandra-3.0,Cassandra,Cassandra 3.0,我在Cassandra的表中有20列。在表演中是否会对表演产生影响 select * from table where partitionKey = 'test'; 我无法从这个链接理解 1) Cassandra表中有太多列(比如20列)会产生什么后果?除非分区上有很多行,否则我看不出有20列会有什么影响。如您链接的文档中所述: 单个分区中的最大单元数(行x列)为20亿 所以,除非您希望在一个分区中有超过1亿行,否则我不明白为什么20列会是一个问题。请记住,Cassandra是一家colum

我在Cassandra的表中有20列。在表演中是否会对表演产生影响

select * from table where partitionKey = 'test';
我无法从这个链接理解


1) Cassandra表中有太多列(比如20列)会产生什么后果?

除非分区上有很多行,否则我看不出有20列会有什么影响。如您链接的文档中所述:

单个分区中的最大单元数(行x列)为20亿

所以,除非您希望在一个分区中有超过1亿行,否则我不明白为什么20列会是一个问题。请记住,Cassandra是一家column家族商店。这个名称意味着Cassandra可以在每个分区中存储大量列

话虽如此,我个人建议每个分区不要超过100MB。它可能会在将来的修复过程中为您带来流媒体问题

===============================

回答你的评论。请记住,分区和行在Cassandra中是两种不同的东西。只有在没有集群列的情况下,分区才等于一行。例如,查看此表创建和插入的值,然后查看sstabledump:

create TABLE tt2 ( foo int , bar int , mar int , PRIMARY KEY (foo , bar )) ;
insert INTO tt2 (foo , bar , mar ) VALUES ( 1, 2, 3) ;
insert INTO tt2 (foo , bar , mar ) VALUES ( 1, 3, 4) ;
./cassandra/tools/bin/sstabledump ~/cassandra/data/data/tk/tt2-1386f69005bd11e89c0bbfb5c1157523/mc-1-big-Data.db 
[
  {
    "partition" : {
      "key" : [ "1" ],
      "position" : 0
    },
    "rows" : [
      {
        "type" : "row",
        "position" : 32,
        "clustering" : [ "2" ],
        "liveness_info" : { "tstamp" : "2018-01-30T12:57:36.362483Z" },
        "cells" : [
          { "name" : "mar", "value" : 3 }
        ]
      },
      {
        "type" : "row",
        "position" : 32,
        "clustering" : [ "3" ],
        "liveness_info" : { "tstamp" : "2018-01-30T12:58:03.538482Z" },
        "cells" : [
          { "name" : "mar", "value" : 4 }
        ]
      }
    ]
  }
]
sstabledump:

create TABLE tt2 ( foo int , bar int , mar int , PRIMARY KEY (foo , bar )) ;
insert INTO tt2 (foo , bar , mar ) VALUES ( 1, 2, 3) ;
insert INTO tt2 (foo , bar , mar ) VALUES ( 1, 3, 4) ;
./cassandra/tools/bin/sstabledump ~/cassandra/data/data/tk/tt2-1386f69005bd11e89c0bbfb5c1157523/mc-1-big-Data.db 
[
  {
    "partition" : {
      "key" : [ "1" ],
      "position" : 0
    },
    "rows" : [
      {
        "type" : "row",
        "position" : 32,
        "clustering" : [ "2" ],
        "liveness_info" : { "tstamp" : "2018-01-30T12:57:36.362483Z" },
        "cells" : [
          { "name" : "mar", "value" : 3 }
        ]
      },
      {
        "type" : "row",
        "position" : 32,
        "clustering" : [ "3" ],
        "liveness_info" : { "tstamp" : "2018-01-30T12:58:03.538482Z" },
        "cells" : [
          { "name" : "mar", "value" : 4 }
        ]
      }
    ]
  }
]
此外,如果使用
-d
选项,可能会更容易查看内部表示。如您所见,对于同一分区,我们有两个不同的行:

./cassandra/tools/bin/sstabledump -d ~/cassandra/data/data/tk/tt2-1386f69005bd11e89c0bbfb5c1157523/mc-1-big-Data.db 
[1]@0 Row[info=[ts=1517317056362483] ]: 2 | [mar=3 ts=1517317056362483]
[1]@32 Row[info=[ts=1517317083538482] ]: 3 | [mar=4 ts=1517317083538482]

除非分区上有很多行,否则我看不到有20列的影响。如您链接的文档中所述:

单个分区中的最大单元数(行x列)为20亿

所以,除非您希望在一个分区中有超过1亿行,否则我不明白为什么20列会是一个问题。请记住,Cassandra是一家column家族商店。这个名称意味着Cassandra可以在每个分区中存储大量列

话虽如此,我个人建议每个分区不要超过100MB。它可能会在将来的修复过程中为您带来流媒体问题

===============================

回答你的评论。请记住,分区和行在Cassandra中是两种不同的东西。只有在没有集群列的情况下,分区才等于一行。例如,查看此表创建和插入的值,然后查看sstabledump:

create TABLE tt2 ( foo int , bar int , mar int , PRIMARY KEY (foo , bar )) ;
insert INTO tt2 (foo , bar , mar ) VALUES ( 1, 2, 3) ;
insert INTO tt2 (foo , bar , mar ) VALUES ( 1, 3, 4) ;
./cassandra/tools/bin/sstabledump ~/cassandra/data/data/tk/tt2-1386f69005bd11e89c0bbfb5c1157523/mc-1-big-Data.db 
[
  {
    "partition" : {
      "key" : [ "1" ],
      "position" : 0
    },
    "rows" : [
      {
        "type" : "row",
        "position" : 32,
        "clustering" : [ "2" ],
        "liveness_info" : { "tstamp" : "2018-01-30T12:57:36.362483Z" },
        "cells" : [
          { "name" : "mar", "value" : 3 }
        ]
      },
      {
        "type" : "row",
        "position" : 32,
        "clustering" : [ "3" ],
        "liveness_info" : { "tstamp" : "2018-01-30T12:58:03.538482Z" },
        "cells" : [
          { "name" : "mar", "value" : 4 }
        ]
      }
    ]
  }
]
sstabledump:

create TABLE tt2 ( foo int , bar int , mar int , PRIMARY KEY (foo , bar )) ;
insert INTO tt2 (foo , bar , mar ) VALUES ( 1, 2, 3) ;
insert INTO tt2 (foo , bar , mar ) VALUES ( 1, 3, 4) ;
./cassandra/tools/bin/sstabledump ~/cassandra/data/data/tk/tt2-1386f69005bd11e89c0bbfb5c1157523/mc-1-big-Data.db 
[
  {
    "partition" : {
      "key" : [ "1" ],
      "position" : 0
    },
    "rows" : [
      {
        "type" : "row",
        "position" : 32,
        "clustering" : [ "2" ],
        "liveness_info" : { "tstamp" : "2018-01-30T12:57:36.362483Z" },
        "cells" : [
          { "name" : "mar", "value" : 3 }
        ]
      },
      {
        "type" : "row",
        "position" : 32,
        "clustering" : [ "3" ],
        "liveness_info" : { "tstamp" : "2018-01-30T12:58:03.538482Z" },
        "cells" : [
          { "name" : "mar", "value" : 4 }
        ]
      }
    ]
  }
]
此外,如果使用
-d
选项,可能会更容易查看内部表示。如您所见,对于同一分区,我们有两个不同的行:

./cassandra/tools/bin/sstabledump -d ~/cassandra/data/data/tk/tt2-1386f69005bd11e89c0bbfb5c1157523/mc-1-big-Data.db 
[1]@0 Row[info=[ts=1517317056362483] ]: 2 | [mar=3 ts=1517317056362483]
[1]@32 Row[info=[ts=1517317083538482] ]: 3 | [mar=4 ts=1517317083538482]

为了理解内部结构,这里的单元格与行和列的关系如何?我检查了sstabledump,我可以看到每一行都有自己的单元格列表,那么我们为什么要将单元格与分区进行比较呢?谢谢,但是有两行有什么意义呢?它与单元格的关系如何?在同一个分区中存储多行,以便在同一个查询中检索它们。由于Cassandra是如何分配数据的,所以您应该只查询一个分区。通过在同一分区中存储多行,您不必陷入查询多个分区的反模式。要了解内部结构,这里的单元格与行和列的关系如何?我检查了sstabledump,我可以看到每一行都有自己的单元格列表,那么我们为什么要将单元格与分区进行比较呢?谢谢,但是有两行有什么意义呢?它与单元格的关系如何?在同一个分区中存储多行,以便在同一个查询中检索它们。由于Cassandra是如何分配数据的,所以您应该只查询一个分区。通过在同一分区中存储多行,您不需要陷入查询多个分区的反模式。