Mysql的分库分表

/ 默认分类 / 0 条评论 / 904浏览

Mysql的分库分表

一.前言

在讨论分库分表之前,先来看下数据库瓶颈在哪里,因为之所以进行分库分表,目的就是为了突破数据库性能瓶颈.

不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值。在业务Service来看就是,可用数据库连接少甚至无连接可用。接下来就可以想象了吧(并发量、吞吐量、崩溃)。

  1. 磁盘读IO瓶颈,热点数据太多,数据库缓存放不下,每次查询时会产生大量的IO,降低查询速度
  2. 网络IO瓶颈,请求的数据太多,网络带宽不够,考虑分库,多个数据库实例
  3. CPU瓶颈,如SQL中包含join,group by,order by,非索引字段条件查询等未经优化的sql,增加CPU运算的操作。这种可以考虑SQL优化,建立合适的索引,在业务模块程序的service层进行业务计算。单表数据量太大,查询时扫描的行太多,SQL效率低,CPU会率先出现瓶颈。

二.分库分表

mysql分表有两种:

  1. 水平分表

就是对数据表进行水平拆分,其实也就是对原来某张整个数据表进行分片,比如一张用户表,可以按照userId来进行分片,比如对userId字段进行hash,得到的数据值可以和某个固定的值比如100进行取余,那么将取余结果是[0,50]的放在t_user_1表中,将取余结果是[51-99]的放在t_user_2表中.

当然这两张表可以选择放在同一个数据库实例上也可以选择分别放在两个数据库实例上面. 如下:

  1. 垂直分表

也就是对单表的字段进行垂直拆分,利用相关字段进行关联,如下:

整体可以参考以下结构图:

分库分表

三.分表的框架

参考: 分库分表1 分库分表2 分库分表3