一.分分合合

说过很多次,不要拘泥于某一个技术的一点,技术是相通的。重要的是编程思想,思想是最重要的。

当数据量大的时候,需要具有分的思想去细化粒度。当数据量太碎片的时候,需要具有合的思想来粗化粒度。

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.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+树,分成多个小的树。

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

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

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

mysql> explain partitions select * from TxnList where startTime>'2016-08-25 00:00:00' and startTime<'2016-08-25 23:59:00';
+----+-------------+-------------------+------------+------+---------------+------+---------+------+-------+-------------+
| id | select_type | table             | partitions | type | possible_keys | key  | key_len | ref  | rows  | Extra       |
+----+-------------+-------------------+------------+------+---------------+------+---------+------+-------+-------------+
|  1 | SIMPLE      | ClientActionTrack | p20160825  | ALL  | NULL          | NULL | NULL    | NULL | 33868 | Using where |
+----+-------------+-------------------+------------+------+---------------+------+---------+------+-------+-------------+
row in set (0.00 sec)

三.分库分表

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

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

区别于分区的是,分区一般都是放在单机里的,用的比较多的是时间范围分区,方便归档。只不过分库分表需要代码实现,分区则是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文件,上面有文件的解释:

[miaojiaxing@Grim testmydata]# ls | grep 'base_info'
base_info_00.frm
base_info_00#P#p_2018.ibd
base_info_00#P#p_2019.ibd
base_info_00#P#p_2020.ibd
base_info_00#P#p_2021.ibd
base_info_00#P#p_init.ibd
base_info_00#P#p_max.ibd
base_info_01.frm
base_info_01#P#p_2018.ibd
base_info_01#P#p_2019.ibd
base_info_01#P#p_2020.ibd
base_info_01#P#p_2021.ibd
base_info_01#P#p_init.ibd
base_info_01#P#p_max.ibd
base_info.frm
base_info.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

链接:www.cnblogs.com/GrimMjx/p/11772033.html

END
最后说个题外话,相信大家都知道视频号了,随着灰度范围扩大,越来越多的小伙伴都开通了视频号。小詹也开通了一个视频号,会分享互联网那些事、读书心得与副业经验,欢迎扫码关注,和小詹一起向上生长!「没有开通发布权限的尽量多互动,提升活跃度可以更快开通哦」(听我一分钟,生活更轻松)(扫码回复 1024 即可领取IT资料包)

彻底搞清楚MySQL分库、分表、分区的区别相关推荐

  1. mysql 分库分表分区总结

    Mysql目录结构 一个库一个目录 MyISAM引擎 InnoDB引擎 分库分表分区总结 对于分区分表 都可以进行横向(按表字段分),纵向分(按数据行分),此文暂时值考虑横向分. 对于分库:分库 分区 ...

  2. MySQL 分库分表与分区的区别和思考

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

  3. MySQL运维(二)MySQL分库分表概念及实战、读取分离详解

    MySQL运维(二)MySQL分库分表详解.读取分离详解 1.MySQL分库分表相关概念 1.1 分库分表概念 1.1.1 分库的原因 分库:就是一个数据库分成多个数据库,部署到不同机器. 如果业务量 ...

  4. 利用RadonDB实现MySQL分库分表

    利用RadonDB实现MySQL分库分表 RadonDB是青云上提供的MySQL分布式解决方案,提供数据库的透明拆分及高可用服务.RadonDB包括Radon, Xenon, MySQL三部分安装.其 ...

  5. 【mysql】MySQL 分库分表方案,总结的非常好!

    文章目录 1. 数据库架构演变 2. 分库分表前的问题 3. 分库分表的方式方法 3.1 垂直分库 3.2 水平拆分 水平分表 水平分库分表 水平分库分表切分规则 4. 分库分表后面临的问题 4.1 ...

  6. 使用EntityFrameworkCore实现Repository, UnitOfWork,支持MySQL分库分表

    昨天(星期五)下班,19:00左右回到家,洗个澡,然后20:30左右开始写代码,写完代码之后,上床看了<生活大爆炸10季>17.18两集,发现没有更新到19集,瞄了一眼手机,竟然已经是凌晨 ...

  7. MySQL分库分表多维度查询——比较好的方法

    转载自:http://blog.itpub.net/29254281/viewspace-2086198/ MySQL分库分表,一般只能按照一个维度进行查询. 以订单表为例, 按照用户ID mod 6 ...

  8. MySQL分库分表面试知识总结

    场景分析 Web开发工作,亦或是海量数据开发工作,学习分库.分表.分区等知识都是很有必要的 . 面试的时候,也有可能也会被问到.不过作为一个有经验的Coder,不熟悉分库.分表技术确实有些 low. ...

  9. MySQL分库分表会带来哪些问题?分库分表问题

    MySQL分库分表会带来哪些问题? 分库分表能有效的环节单机和单库带来的性能瓶颈和压力,突破网络IO.硬件资源.连接数的瓶颈,同时也带来了一些问题.下面将描述这些技术挑战以及对应的解决思路. 分库分表 ...

  10. MySQL分库分表面试知识点

    目录 1 问题分析: 1.1 背景 1.2 业务分库 1.3 数据库分表 2 为什么要分库分表? 3 用过哪些分库分表中间件? 3.1 你们具体是如何对数据库如何进行垂直拆分或水平拆分的? 4 Mys ...

最新文章

  1. 2022-2028年中国联合办公行业深度调研及投资前景预测报告
  2. pytorch torch.nn.MSELoss(size_average=True)(均方误差【损失函数】)Mean Squared Error(MSE)、SSE(和方差)
  3. Rocchio算法—文本分类
  4. spring cloud连载第一篇之bootstrap context
  5. 爱的历史摘录(西蒙·梅)
  6. matlab2008 软件下载及安装教程
  7. 利用tftpd32拷贝windows文件到虚拟机ubuntu中
  8. QT文本文档之新建文本
  9. 基于CC2430和DS18B20的无线测温系统设计
  10. 红米android刷机在哪,红米手机怎么刷机 红米手机刷机教程大全
  11. 【C#】操作局域网共享文件夹文件,将本地文件复制到共享文件夹
  12. Origin双Y轴图形画法,添加图例,合并图例
  13. AD2428W手册解读之操作与配置
  14. 股神巴菲特名言及股神巴菲特选股技巧有哪些
  15. 每日加瓦,终成栋房6-展望未来(SpringBoot)
  16. Andorid中使用Gson和Fast-json解析库解析JSON数据---第三方库学习笔记(二)
  17. 2018总结----对共享单车的思考
  18. Android折线图,柱状图,股票走势图,基金走势图
  19. ActiveSync 3.7
  20. 2021年安全员-B证(安全员)及安全员-B证(安全员)实操考试视频

热门文章

  1. django 框架中应用 redis 集群(亲测)
  2. Linux正则和grep命令
  3. 写入MySQL报错超出 max_allowed_packet 的问题
  4. 安装 MongoDB PHP 驱动 在CentOS 6.x和遇到的问题
  5. 为什么Nginx的性能要比Apache高很多?
  6. PHP中类明明存在 但class_exists 确检测不到的坑: 使用完整命名空间
  7. Bug只让变量生效一次的思路
  8. 排序算法有哪些_超强整理,科班算法岗的秋招之路
  9. roboware studio_关于安装Roboware的教程
  10. mongodb单机部署