手把手基于Mycat实现MySQL数据拆分

满怀忧思不如先干再说!
前言数据库拆分属于中高级开发要做的事情,不过具体的看企业吧 。各种情况都会出现,这篇文章主要是基于Mycat去实现一下数据库拆分,至于拆分的思想,后边补一篇文章来说!本篇先简单介绍一下,至于优缺点暂且不说,大家可以在操作或者阅读的过程中自己先感受一下,大概分为两种:
  • 垂直拆分:垂直分库 和 垂直分表
  • 水平拆分:库内分表 和 分库分表
分库分表看起来很厉害的技术,其实项目中来说的话可以不分库分表还是不要分的好!
垂直拆分-分库 
垂直分库就是根据业务耦合性,将关联度低的不同表存储在不同的数据库 。做法与大系统拆分为多个小系统类似,按业务分类进行独立划分 。与"微服务治理"的做法相似,每个微服务使用单独的一个数据库 。
手把手基于Mycat实现MySQL数据拆分

文章插图
 
垂直拆分-分表
垂直分表是基于数据库中的"列"进行,某个表字段较多,可以新建一张扩展表,将不经常用或字段长度较大的字段拆分出去到扩展表中 。在字段很多的情况下(例如一个大表有100多个字段),通过"大表拆小表",更便于开发与维护,也能避免跨页问题,MySQL底层是通过数据页存储的,一条记录占用空间过大会导致跨页,造成额外的性能开销 。另外数据库以行为单位将数据加载到内存中,这样表中字段长度较短且访问频率较高,内存能加载更多的数据,命中率更高,减少了磁盘IO,从而提升了数据库性能 。
手把手基于Mycat实现MySQL数据拆分

文章插图
 
水平拆分
当一个应用难以再细粒度的垂直切分,或切分后数据量行数巨大,存在单库读写、存储性能瓶颈,这时候就需要进行水平切分了 。
水平切分分为库内分表和分库分表,是根据表内数据内在的逻辑关系,将同一个表按不同的条件分散到多个数据库或多个表中,每个表中只包含一部分数据,从而使得单个表的数据量变小,达到分布式的效果 。如图所示:
手把手基于Mycat实现MySQL数据拆分

文章插图
 
库内分表只解决了单一表数据量过大的问题,但没有将表分布到不同机器的库上,因此对于减轻MySQL数据库的压力来说,帮助不是很大,大家还是竞争同一个物理机的CPU、内存、网络IO,最好通过分库分表来解决 。
垂直拆分-分库实现方式 配置mycat的schema配置文件 mysql" dbDriver="native" switchType="1" slaveThreshold="100"> select user() root" password="123456"> select user()
在两个mysql实例中分别创建orders数据库
CREATE DATABASE orders;
登陆Mycat创建四张表
-- 用户表,假如有20W用户 CREATE TABLE customer( id INT AUTO_INCREMENT, NAME varchar(20), PRIMARY KEY (id) ); -- 订单表,假如有2000W个订单 CREATE TABLE orders( id INT AUTO_INCREMENT, order_type INT, customer_id INT, amount DECIMAL(10,2), PRIMARY KEY (id) ); -- 订单详情表,数据量和订单表一样 CREATE TABLE order_detail( id INT AUTO_INCREMENT, detail VARCHAR(20), order_id INT, PRIMARY KEY (id) ); -- 字典表,数据量假如有20条,对应订单的类型字典,类型说明数字对应字符串,订单表中只需要存储数字即可 CREATE TABLE dict_order_type( id INT AUTO_INCREMENT, order_type VARCHAR(20), PRIMARY KEY (id) );
查看表
如下图,在Mycat上创建完之后Mycat窗口可以查询出四张表,stt202上有一张customer表,stt203上有三张表,和我们理想效果一样
手把手基于Mycat实现MySQL数据拆分

文章插图
 
水平拆分-分库分表
我们发现order和order_detail两张表中数据量非常多,如果存储在同一个节点上的同一个库中性能会受到影响,我们考虑将order表和order_detail表进行拆分,分布式存储全量数据,平均存储在两台节点上 。
切片规则