分区、分库分表

发布时间:2024年01月17日

👽System.out.println(“👋🏼嗨,大家好,我是代码不会敲的小符,双非大四,Java实习中…”);
📚System.out.println(“🎈如果文章中有错误的地方,恳请大家指正!共同进步,共同成长?”);
🌟System.out.println(“💡如果文章对您有所帮助,希望您可以三连支持一下博主噢🔥”);
🌈System.out.println("🚀正在完成计划中:接下来的三个月里,对梦想的追逐 ");

背景

中午去吃饭的路上,我提出了关于数据库分库分表和分区区别的问题。问了大哥们,大哥们解释的有点没听懂!!只知道这两个是不搭边的东西,我理解的也有点混乱,这里补一下基础吧!!!

分区表

把一张表的数据分成N多个区块。分区表是一个独立的逻辑表,底层是由多个子表组成。

  • 当查询条件的数据分布在某一个分区时,查询引擎只会区某一个分区查询,并不遍历整个表。
  • 当删除某一个分区的数据时,只需要删除对应的分区。

分区是mysql内部实现的,分库分表需要代码实现。分区和分库分表并不冲突,可以结合使用。按时间进行分区比较多。

产生的问题

  1. 查询分区表时,mysql需要在过滤操作之前打开并锁住所有的底层表,因此并无法通过分区过滤降低开销,影响查询速度。可以通过批量操作降低锁住所用底层表带来的开销。
  2. 维护分区的成本偏高。例如重组分区,会先创建一个临时分区,然后将数据复制到其中,最后再删除原分区。
  3. 所有分区必须使用相同的存储引擎。

分库分表

原因:单表数据量太大,数据库负担大,性能影响到了系统的正常使用。
解决:对其进行切分,减少数据库的负担,缩短查询时间。

垂直划分

分库:根据业务场景,将不同的表分别划分出一个库,降低单库的大小提高性能。
分表:按列进行切割划分。类似于一个表划分为多个子表。

优点:行记录变小,数据页可存放更多记录,减少查询时的I/O次数。业务耦合性低,业务清晰。

产生的问题

  1. 主键冗余,维护困难,查询效率低
  2. 有些表连接join的操作,只能通过在业务服务器进行join操作,提高代码复杂性
  3. 存在单表数据量过大问题。
  4. 分布式事务处理复杂。

水平划分

分库:同样的表在多个数据库中。降低单库的数据量。
分表:将数据进行拆分(比如根据时间、id进行拆分),降低单表的数据量。

优点:不存在单库数据量过大、高并发的性能瓶颈,提升系统稳定性和负载能力。业务程序改动较少

产生的问题

  1. 分片事务一致性难以解决。
  2. 跨库、跨节点 join 性能差,逻辑复杂。
  3. 数据分片在扩容时需要迁移、数据扩展难度和维护量极大。

最后

慢慢的来,别着急!学会有质量的走过每一步


我是代码不会敲的小符,希望认识更多有经验的大佬,也在努力摸索出自己的道路
欢迎添加小符微信:A13781678921,一起加油

文章来源:https://blog.csdn.net/weixin_57780057/article/details/135657712
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。