数据应该根据不同的需求存储,mysql适合oltp,acid事务型,如果有些数据是日志流、事件流、PB级别拓展、做统计的用处比较多,那么就需要一些比较适合的存储库;毕竟mysql拓展性也非常差;
数据我们习惯了行式表达,但如果特别针对一个库中的某一列特别的需要聚合计算,如果在物理上用行式存储,那么查询数据的读盘的有效率就会低(一次读盘只有部分数据可用),所以列式存储就显得很重要,因为需要查找库中所有该列的数据,他们都存储在一起,自然就加大了读盘有效率。
主键row key是在列式存储中最重要的概念,因为数据是唯一按照row key的物理顺序存储的,row key的设计也显得非常关键,一般来说,row key是多个列的组合,是多列索引,所以支持前缀索引,同时可以利用row key做二级索引,当然也可以做覆盖索引;可以把主键理解是map中的key,而value就是其他非主键列。
因为数量量大,所以对于数据的更新和删除就不再适合物理操作,而是使用版本操作,数据库中版本操作的例子很多,例如MVVC利用多版本做并发控制,而列数据库则用作标记数据更新;
region,存储、计算的一个整体区域,分区一般最大的含义就是按照物理机器分区,因为分布式用不同机器组成一个大的逻辑库,才能支持高可用和高性能,但前提是所有的请求都能均衡的分布到不同的机器中,我们这里把机器抽象为region,上面我们说,数据是按照主键物理排列存储的,所以如果要达成机器的均衡,我们希望数据的读取和写入不要集中在一个region中;如果一个数据库是按照范围分区,那么这就要求row key的设计最好不要是自增的;
针对分区,我们需要另一个概念,就是partitionKey,只要patitionKey和rowKey都设计合理,才能发挥好分布式数据库架构的性能;