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

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

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

文章插图
库内分表只解决了单一表数据量过大的问题,但没有将表分布到不同机器的库上,因此对于减轻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上有三张表,和我们理想效果一样

文章插图
水平拆分-分库分表
我们发现order和order_detail两张表中数据量非常多,如果存储在同一个节点上的同一个库中性能会受到影响,我们考虑将order表和order_detail表进行拆分,分布式存储全量数据,平均存储在两台节点上 。
切片规则
- 我们切分表中数据需要按照一定的规则切分,比如按照时间,id,用户id等
- 如果按照时间切分,老的数据存储在一起,新的数据存储在一起,用户一般查询的是新的数据,所以会导致新数据所在节点的负载要高于旧数据节点
- 如果按照id分区与日期效果类似,一样会导致节点负载不均匀
- 在本例中我们可以按照customer_id分配,具体的项目需求大家在具体考虑,尽可能让数据平均分配,节点负载均衡
推荐阅读
- 手把手教你如何追到天秤女
- 手把手教你在家做清蒸鲈鱼
- |手把手教你盘玩木雕把件
- 手把手教你如何清理打印机喷头 如何清洗打印头
- 手把手教你如何用手机快速将图片中文字提取出来
- 手把手教您在家蒸包子 自己在家做包子的方法
- 郭富城|郭富城手把手教小朋友写字,不到一分钟筹得近百万,每个字值23万
- 金晨|张继科金晨撒狗粮啦!张继科手把手教金晨打乒乓球,画面太甜了!
- Java探针-Java Agent技术
- 热热闹闹过圣诞,怎么布置圣诞节场景手把手教
