分区和分表的优缺点_分区和分表的区别

分区和分表的优缺点_分区和分表的区别MySQL 分库分表与分区的区别和思考一.分分合合1.1 分2.2 合二.分区2.1 实现方式2.2 内部文件2.3 数据处理三.分库分表3.1 实现3.2 分布式数据库中间件3.3 内部文件3.4 问题四.总结《Java 2019 超神之路》《Dubbo 实现原理与源码解析 ——

MySQL 分库分表与分区的区别和思考
  一.分分合合1.1 分2.2 合二.分区2.1 实现方式2.2 内部文件2.3 数据处理三.分库分表3.1 实现3.2 分布式数据库中间件3.3 内部文件3.4 问题四.总结《Java 2019 超神之路》《Dubbo 实现原理与源码解析 —— 精品合集》《Spring 实现原理与源码解析 —— 精品合集》《MyBatis 实现原理与源码解析 —— 精品合集》《Spring MVC 实现原理与源码解析 —— 精品合集》《Spring Boot 实现原理与源码解析 —— 精品合集》《数据库实体设计合集》《Java 面试题 —— 精品合集》《Java 学习指南 —— 精品合集》

  一.分分合合

  说过很多次,不要拘泥于某一个技术的一点,技术是相通的。重要的是编程思想,思想是最重要的。当数据量大的时候,需要具有分的思想去细化粒度。当数据量太碎片的时候,需要具有合的思想来粗化粒度。

  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分区的博客所以这里不会多费笔墨来写,具体见:

  http://cnblogs.com/GrimMjx/p/10526821.html

  2.1 实现方式

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

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

  2.2 内部文件

  先去data目录,如果不知道目录位置的可以执行:

  分区和分表的优缺点_分区和分表的区别分区和分表的优缺点_分区和分表的区别

  接下来看下内部文件:

  分区和分表的优缺点_分区和分表的区别分区和分表的优缺点_分区和分表的区别

  从上图我们可以看出,有2中类型的文件,.frm文件和.ibd文件

  frm文件:表结构文件

  ibd文件:InnoDB中,索引和数据都在同个文件.ibdata(你的执行结果可能是.MYD索引文件和.MYI数据文件,没关系,这是MyIsAm存储引擎,对应着InnoDB的.ibd文件)。因为Order这张表分为5个区,所以有5个这样的文件

  par文件:你执行的结果可能有.par文件也可能没有。注意:从MySql 5.7.6开始,不再创建.par分区定义文件。分区定义存储在内部数据字典中。

  2.3 数据处理

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

  (PS:如果想研究一颗聚集索引B+树可以放多少行数据,请看:http://cnblogs.com/GrimMjx/p/10540263.html)

  读的效率肯定提升了,如果走分区键索引的话,先走对应分区的辅助索引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进行处理。通常仅支持一种语言,如果其他语言要使用,需要开发多语言客户端。

  各自的优缺点如下:

  分区和分表的优缺点_分区和分表的区别分区和分表的优缺点_分区和分表的区别

  3.3 内部文件

  找了一个分库分表+分区的例子,基本上和分区表的差不多,只是多了多了很多表的.ibd文件,上面有文件的解释:

  3.4 问题

  3.4.1 事务问题

  既然分库分表了,那么肯定涉及到分布式事务,如何保证插入到不同库的多条记录能够要么同时成功,要么同时失败。有些同学可能想到XA,XA性能差而且不需要使用mysql5.7。柔性事务是目前主流的方案,TCC模式就属于柔性事务。

  对于分布式事务问题每家公司有自己的实现,华为用saga,阿里用TXC,蚂蚁用DTX,支持FMT模式和TCC模式。

  分区和分表的优缺点_分区和分表的区别分区和分表的优缺点_分区和分表的区别

  3.4.2 join问题

  tddl、MyCAT等都支持跨分片join。但是尽力避免跨库join,比如通过字段冗余的方式等。

  如果出现了这种情况且中间件支持分片join,那么可以这样使用。如果不支持可以手工查询。

  四.总结

  分表和在用途上不一样,分表是为了承接超大规模的表,单机放不下那种。

  分区的话则一般都是放在单机里的,用的比较多的是时间范围分区,方便归档。

  性能稳定上的话都是一个个子表,差不多,区别应该是分区表是mysql内部实现的,会比分表方案少一点数据交互只要你坚持,一步一步来,总归会成功的。

  切忌,学技术急不来,快就是稳,稳就是快。技术有限,接收指正。如果您觉得写的可以,请点个推荐。

  来源:GrimMjx cnblogs.com/GrimMjx/p/11772033.html

  :-D 搜索号(ID:芋道源码),可以获得各种 Java 源码解析、原理讲解、面试题、学习指南。

  :-D 并且,sigusoft【书籍】后,可以领取笔者推荐的各种 Java 从入门到架构的 100 本书籍。

  :-D 并且,sigusoft【技术群】后,可以加入专门讨论 Java、后端、架构的技术群。

  分区和分表的优缺点_分区和分表的区别分区和分表的优缺点_分区和分表的区别

  来吧,骚年~

激活谷谷主为您准备了激活教程,为节约您的时间请移步至置顶文章:https://sigusoft.com/99576.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/95259.html

(0)
上一篇 2024年 5月 25日
下一篇 2024年 5月 25日

相关推荐

  • 分区分桶的原理_分区分桶的区别

    分区分桶的原理_分区分桶的区别说一下为什么hive会有分区表的概念,以及分区和分桶的区别说一下为什么hive会有分区表的概念,以及分区和分桶的区别总结回答在传统的数据库系统中,一般都具有表分区的功能,作用通过表分区能够在特定的区域检索数据,减少扫描成本,在一定程度上提高了查询效率,当然我们还可以通过进一步在分区上建立索引,进

    激活谷笔记 2024年 5月 28日
  • python string转换成float_python string转换为float

    python string转换成float_python string转换为floatpython中string和float之间如何转换?Python将string转换到float的实例方法当我们使用不同类型的数据时,会根据使用场景的不同,进行一定的转换操作。提起string和float大家肯定不陌生,前者作用于字符串,后者是一种常见的小数数据类型。下面

    2024年 5月 25日
  • eclipse全局搜索_eclipse怎么查找代码

    eclipse全局搜索_eclipse怎么查找代码怎么调出全局搜索_eclipse全局搜索快捷键是什么【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、i

    激活谷笔记 2024年 5月 11日
  • html的单标签_html的单标签有哪些

    html的单标签_html的单标签有哪些纯干货分享,前端面试题搜集一、理论知识(推荐视频课程:HTML+CSS+JS+vue前端基础入门~https://www.bilibili.com/video/av82371580)更多学习内容:我的学习交流群点击:web前端学习交流群1.1、讲讲输入完网址按下回车

    激活谷笔记 2024年 5月 30日
  • 什么叫线程同步_什么叫线程同步器

    什么叫线程同步_什么叫线程同步器Java同步器简述一、概述在并发编程领域,有两大核心问题:一个是互斥,即同一时刻只允许一个线程访问共享资源;另一个是同步,即线程之间如何通信、协作。主要原因是,对于多线程实现实现并发,一直以来,多线程都存在2个问题:线程之间内存共享,需要通过加锁进

    激活谷笔记 2024年 5月 29日
  • Ubuntu安装教程详解_centos6.9安装教程详解

    Ubuntu安装教程详解_centos6.9安装教程详解史上最完整Linux安装步骤—CentOS7.6,CentOS6.10,Ubuntu的安装步骤详解第一部分:安装前准备 一、安装VMware虚拟机 应用商城或官网均可直接下载安装,在csdn搜素‘vmware16密钥永久’可搜出永久密钥填写在密钥处即可。 二

    2024年 5月 13日
  • socket 网络编程

    socket 网络编程socket编程什么是socket?简称套接字,是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多数是基于socket来完成通信的。socket是基于C/S架构的,

    激活谷笔记 2024年 5月 18日
  • 数组用指针赋值吗_数组用指针赋值吗为什么

    数组用指针赋值吗_数组用指针赋值吗为什么为什么说函数只能返回一个值,返回一个数组或指针依次赋值给变量不可以吗?菜鸟求指点可以啊!更好的做法是结构体,可以返回多个不同类型的值返回一个C数组是不行的。但你可以返回C++的array、tuple和pair。这些都要求

    激活谷笔记 2024年 5月 25日
  • ubuntu与linuxmint比较_mint和ubuntu做编程哪个好用

    ubuntu与linuxmint比较_mint和ubuntu做编程哪个好用Ubuntu vs Mint:哪个更好?Ubuntu和Mint,它们可能是最流行的两个Linux发行版,但是有什么区别呢?Linux可能不是每个人的一杯茶。很多人认为它与Windows相比过于复杂,而且不像Apple的Mac那样功能友好。但是,如果你希望切换计算机平台,Lin

    2024年 5月 17日
  • malloc 源码_malloc源码

    malloc 源码_malloc源码malloc底层原理学习本文主要整理我最近搜集到的各路资料,看了别人的代码并且加上一些个人的理解。首先先重新审视堆这个数据结构。在程序中,堆用于动态分配和释放程序所使用的对象。在以下情况中调用堆操作:1.事先不知道程序所需对象的数量和大

    激活谷笔记 2024年 5月 30日
  • 怎么修改xml文件内容_怎么修改xml文件内容

    怎么修改xml文件内容_怎么修改xml文件内容python修改xml文件内容,不废话,拿来即用XML 被设计用来传输和存储数据。HTML 被设计用来显示数据。XML 指可扩展标记语言(eXtensible Markup Language)。可扩展标记语言(英语:Ex

    激活谷笔记 2024年 5月 22日
  • anaconda改为中文_anaconda汉化教程

    anaconda改为中文_anaconda汉化教程Miniconda 镜像使用帮助Anaconda 镜像使用帮助 Anaconda 是一个用于科学计算的 Python 发行版,支持 Linux, Mac, Windows, 包含了众多流行的科学计算、数据分析的 Python 包。 Anaconda 安装包可以到 http

    激活谷笔记 2024年 5月 16日
关注微信