• 【列数据库】NoSql的bigTable存储


    前言:

      数据应该根据不同的需求存储,mysql适合oltp,acid事务型,如果有些数据是日志流、事件流、PB级别拓展、做统计的用处比较多,那么就需要一些比较适合的存储库;毕竟mysql拓展性也非常差;

    列式存储:

      数据我们习惯了行式表达,但如果特别针对一个库中的某一列特别的需要聚合计算,如果在物理上用行式存储,那么查询数据的读盘的有效率就会低(一次读盘只有部分数据可用),所以列式存储就显得很重要,因为需要查找库中所有该列的数据,他们都存储在一起,自然就加大了读盘有效率

    主键:

      主键row key是在列式存储中最重要的概念,因为数据是唯一按照row key的物理顺序存储的,row key的设计也显得非常关键,一般来说,row key是多个列的组合,是多列索引,所以支持前缀索引,同时可以利用row key做二级索引或覆盖索引;可以把主键理解是map中的key,而value就是其他非主键列。

      最左前缀:

      主键由多个列组成,一般是按照最左前缀匹配,可以理解为主键是一个前套的map,例如三个主键列A,B,C组成的主键,那么就是SortMap<A,SortMap<B,SortMap<C,Object>>>的结构;查找也是这样的原理,一季级级匹配;

    版本:

      因为数量量大,所以对于数据的更新和删除就不再适合物理操作,而是使用版本操作,数据库中版本操作的例子很多,例如MVVC利用多版本做并发控制,而列数据库则用作标记数据更新;

    Region:

      region,存储、计算的一个整体区域,分区一般最大的含义就是按照物理机器分区,因为分布式用不同机器组成一个大的逻辑库,才能支持高可用和高性能,但前提是所有的请求都能均衡的分布到不同的机器中,我们这里把机器抽象为region,上面我们说,数据是按照主键物理排列存储的,所以如果要达成机器的均衡,我们希望数据的读取和写入不要集中在一个region中;如果一个数据库是按照范围分区,那么这就要求row key的设计最好不要是自增的;

      针对分区,我们需要另一个概念,就是partitionKey,只要patitionKey和rowKey都设计合理,才能发挥好分布式数据库架构的性能;

    Denormalization:

      其实针对某些查询优化,如果全表扫描会很多,不如针对这些查询进行设计,因为对于文件数据库,顺序写入,一般写的代码远低于读取的代码,所以不如利用流计算,进行反规格化设计,查询是为了计算,不如在存储前利用流失计算先计算好结果存储在一张新表,再查询新表;

    索引:

      列式数据库一般采用LSM(日志结构合并树),该算法适合写多读少的情况,因为LSM的假设就是内存足够大,现在内存操作同时记录log防翻车,然后写入一定程度后,利用归并排序,合并所有结构化小树,写入磁盘;

    -------------------------------- 优秀、是一种习惯 、、、、、、、、、、、、、、、
  • 相关阅读:
    MyBatis执行sql的整个流程
    Ftp传输:向linux服务器上传文件时“550 Permission denied.”错误问题解决
    SpringBoot框架:两个方法同时调用时父方法使内部方法的DataSource注解失效的解决办法
    SpringBoot框架:通过AOP和自定义注解完成druid连接池的动态数据源切换(三)
    SpringBoot框架:配置文件application.properties和application.yml的区别
    SpringBoot框架:'url' attribute is not specified and no embedded datasource could be configured问题处理
    bash脚本打印字符串一个空格的内容
    gethostbyname的线程安全
    算法工程师的职业规划
    理解Deep Link & URI Schemes & Universal Link & App Link
  • 原文地址:https://www.cnblogs.com/iCanhua/p/15730680.html
Copyright © 2020-2023  润新知