分库分表分区的区别

Posted ltt324

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分库分表分区的区别相关的知识,希望对你有一定的参考价值。

1.1 分

很多技术都运用了分的编程思想,这里来举几个例子,这些都是分的思想

  • 集中式服务发展到分布式服务

  • 从Collections.synchronizedMap(x)到1.7ConcurrentHashMap再到1.8ConcurrentHashMap,细化锁的粒度的同时依旧保证线程安全

  • 从AtomicInteger到LongAdder,ConcurrentHashMap的size()方法。用分散思想,减少cas次数,增强多线程对一个数的累加

  • JVM的G1 GC算法,将堆分成很多Region来进行内存管理

  • Hbase的RegionServer中,将数据分成多个Region进行管理

  • 平时开发是不是线程池都资源隔离

2.2 合

很多技术也运用到了合的编程思想,这里举几个例子,这些都是合的思想

  • TLAB(Thread Local Allocation Buffers),线程本地分配缓存。避免多线程冲突,提高对象分配效率

  • 逃逸分析,将变量的实例化内存直接在栈里分配,无需进入堆,线程结束栈空间被回收。减少临时对象在堆内分配数量

  • CMS GC算法下,虽然使用标记清除,但是也有配置支持整理内存碎片。如:-XX:UseCMS-CompactAtFullCollection(FullGC后是否整理,Stop The World会变长)和-XX:CMSFullGCs-BeforeCompaction(几次FullGC之后进行压缩整理)

  • 锁粗化,当JIT发现一系列连续的操作都是对同一对象反复加锁和释放锁,会加大锁同步的范围

  • kafka的网络数据传输有一些数据配置,减少网络开销。如:batch.size和linger.ms等等

  • 平时开发是不是都个叫批量获取接口

  • 二.分区

    本文一切基于mysql InnoDB

    说了这么多,接下来说主体,先说分区,因为之前博主写过一篇MySql分区的博客所以这里不会多费笔墨来写

    2.1 实现方式

    具体如何实现上面链接里有写,这里只需记住如果表中存在主键或唯一索引时,分区列必须是唯一索引的一个组成部分。

    这个是数据库分的,应用透明,代码无需修改任何东西。

  • 2.3 数据处理

    分区表后,提高了MySql性能。如果一张表的话,那就只有一个.ibd文件,一颗大的B+树。如果分表后,将按分区规则,分成不同的区,也就是一个大的B+树,分成多个小的树。

    读的效率肯定提升了,如果走分区键索引的话,先走对应分区的辅助索引B+树,再走对应分区的聚集索引B+树。

    如果没有走分区键,将会在所有分区都会执行一次。会造成多次逻辑IO!

    平时开发如果想查看sql语句的分区查询可以使用explain partitons select xxxxx语句。可以看到一句select语句走了几个分区

  • 三.分库分表

    当一张表随着时间和业务的发展,库里表的数据量会越来越大。数据操作也随之会越来越大。

    一台物理机的资源有限,最终能承载的数据量、数据的处理能力都会受到限制。这时候就会使用分库分表来承接超大规模的表,单机放不下的那种。

    区别于分区的是,分区一般都是放在单机里的,用的比较多的是时间范围分区,方便归档。只不过分库分表需要代码实现,分区则是mysql内部实现。分库分表和分区并不冲突,可以结合使用。

  • 3.1 实现

    3.1.1 分库分表标准

    • 存储占用100G+

    • 数据增量每天200w+

    • 单表条数1亿条+

    3.1.2 分库分表字段

    分库分表字段取值非常重要

    1. 在大多数场景该字段是查询字段

    2. 数值型

    一般使用userId,可以满足上述条件

    3.2 分布式数据库中间件

    分布式数据库中间件分为两种,proxy和客户端式架构。proxy模式有MyCat、DBProxy等,客户端式架构有TDDL、Sharding-JDBC等。

    那么proxy和客户端式架构有何区别呢?各自有什么优缺点呢?其实看一张图便可知晓。

    proxy模式的话我们的select和update语句都是发送给代理,由这个代理来操作具体的底层数据库。所以必须要求代理本身需要保证高可用,否则数据库没有宕机,proxy挂了,那就走远了。

    客户端模式通常在连接池上做了一层封装,内部与不同的库连接,sql交给smart-client进行处理。通常仅支持一种语言,如果其他语言要使用,需要开发多语言客户端。

  • 四.总结

    分表和在用途上不一样,分表是为了承接超大规模的表,单机放不下那种。分区的话则一般都是放在单机里的,用的比较多的是时间范围分区,方便归档

    性能稳定上的话都是一个个子表,差不多,区别应该是分区表是mysql内部实现的,会比分表方案少一点数据交互。

以上是关于分库分表分区的区别的主要内容,如果未能解决你的问题,请参考以下文章

Mysql分表和分区的区别分库分表介绍与区别

分库分表分区的区别

分库分表分区的区别

MySql分库分表与分区的区别和思考

MySql 分库分表与分区的区别和思考

头条分库分表与分区的区别和思考