MySql数据库为什么要进行分库分表操作

作者:admin 发布时间:2020-02-28 12:58:54 浏览:1261次

一.分库分表

  当一张表随着时间和业务的发展,库里表的数据量会越来越大。数据操作也随之会越来越大。一台物理机的资源有限,最终能承载的数据量、数据的处理能力都会受到限制。这时候就会使用分库分表来承接超大规模的表,单机放不下的那种。

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

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数据库为什么要进行分库分表操作

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内部实现的,会比分表方案少一点数据交互

如需转载请保留本文出处: https://zhe94.com/615.html

上一篇:快速建站之前言:如何建立一个自己的网站
下一篇:Mysql 中 MyISAM 和 InnoDB 的区别有哪些?怎么选择