首页 > 其他分享 >分库分表方案

分库分表方案

时间:2023-01-23 14:33:18浏览次数:57  
标签:方案 分库 查询 垂直 订单 分表 ID

一、为什么要进行分库分表

当MySQL单表数据量过大,比如超过5千万条的时候,读写性能变得很差。而且常规的优化手段已经不起作用了,比如:SQL调优、添加索引、主从复制、读写分离。这时候就需要用到MySQL终极优化方案 — 分库分表。

二、怎么判断项目是需要分库还是要分表?是先分库还是先分表

  • 当数据库的QPS过高,数据库连接数不足的时候,就需要分库。(比如一个库的连接数支持2K,分成两个库就能支持4K)

  • 微服务架构中,为了业务隔离,一般也做分库处理。

  • 当单表数据量过大,读写性能较差,就需要分表。

  • 当两者都有的时候,就需要分库分表。

至于先分库还是先分表?建议先分表,如果分表能解决问题,就不需要分库了,毕竟需要单独服务器资源,成本更高。

三、分库分表有哪些拆分方案

分库分表有垂直拆分和水平拆分,垂直拆分又有垂直分库、垂直分表。

  • 垂直分库:不同的业务拆分到不同的数据库(比如微服务分库)。

  • 水平分库:单张表QPS过高,把同一个表的数据按一定规则拆到不同的数据库中,每个库可以放在不同的服务器上。(解决了单库大数据,高并发的性能瓶颈)

  • 垂直分表:把长度较大或者访问频次较低的字段,拆分到扩展表中。

  • 水平分表:单表数据量过大时,按照订单ID拆分到多张表中。

垂直分库

 

垂直分表

 

四、分库分表的缺点及解决方案

4.1 缺点
  • 垂直分库: 不同库多表之间无法join关联查询,只能通过接口聚合(MySQL有另外一种方式:MySQL跨库查询),复杂度直线上升。 横跨多个数据库导致无法使用本地事务,数据强一致性就别想了,只能引入更为复杂的分布式事务,勉强实现数据的最终一致性,可用性直线下降。

  • 垂直分表: 本来一张表能查出来的数据,现在需要多张表join关联查询,增加复杂度。

  • 水平分表: 多张表关联查询时,无法实现分页、排序功能。

4.2 解决方案

1、跨库查询问题:

采用字段冗余方案,比如订单表存储店铺ID、店铺名称,就不需要再查询商户数据库了。 不过这种方案要求冗余字段要很少变动,就算变动后,也能容忍返回旧数据。

2、多表分页查询问题:

这个处理起来就很需要技术含量了,比如:订单表按照订单ID分片,(order_id % 128),分成了128张表。同一个用户的订单散落在不同的表,用户想查询自己的订单,根本无法做到分页查询。难道一次全部查询该用户的所有订单,然后做内存分页,多大的机器内存都让你搞挂。

想要实现用户订单分页查询,可以采用按照用户ID分片,(user_id % 128),这样同一个用户的订单只会存储在一张表中,咋分页展示都行。

4.2.1 如果商户想要分页查看自己店铺的订单怎么办?

那就把订单再冗余存储一份,按照店铺ID分片,(shop_id % 128)。不过由于商户数量较少,可以搞个异步线程往商户订单分片表同步。

4.2.2 订单按照用户ID分片后,发生数据倾斜怎么办?

因为不同用户的订单量是不同的,一个爱好购物的小姐姐的订单量抵得上几十个老爷们,导致一张表数据几百条,另一张表数据量千万级,这该咋整?做冷热数据分离,基础库只存储3个月内的订单,其他的移动到历史订单库。这个要跟产品商量好,3个月前的订单需要单独的查询页面。

五、跨库事务问题

 

跨库事务问题

下一个订单需要调用多个服务,只能使用分布式事务。 分布式事务的实现非常复杂,常用的有以下几种解决方案:

  • 二阶段提交

  • TCC

  • 本地消息表

  • MQ事务消息

  • 分布式事务中间件

原文地址:https://www.jianshu.com/p/919a8f9f0282

 

标签:方案,分库,查询,垂直,订单,分表,ID
From: https://www.cnblogs.com/songjuntao/p/17065159.html

相关文章

  • @Accessors(chain=true)注解报错的解决方案
    @Accessors(chain=true)注解报错的解决方案如下所示:CannotinvokesetItemTitle(String)ontheprimitivetypevoid定义的实体类如下:@DatapublicstaticclassRefu......
  • 关于github访问不稳定的解决方案
    记录自己解决的过程 遇到的与问题是 打炉石的hdt插件需要github下载于是引出了标题 然后百度了下   解决国内github.com打不开的准确方法-知乎(zhihu.......
  • 郭总云IOT Studio 1.0 演示视频拍摄方案
    标题:自建云平台,”潮“玩ESP8266标签:物联网IOTESP8266微信小程序云平台视频大纲上实物照片和和代码花絮;设备照:(面包板和裸板设备的合照;裸板设备各个角度的微距;给交......
  • 【Redis技术专区】「实战案例」谈谈使用Redis缓存时高效的批量删除的几种方案
    前因后果之前我们的服务,在上线的时候发现有一些大Key的使用不是很规范,特别是没有设置过期时间,因此导致redis中内存的数据越来越多,目前Redis节点的内存已经快撑不住了。所以......
  • unity 打开vs没有解决方案_Unity使用VS Code编写C#代码没有代码补全怎么解决?
    问题描述换了电脑之后,先安装的VS2022,在安装时已加入了Unity编辑器的扩展工具,然后再安装的UnityHub以及Unity2018-2021,创建项目之后,从Unity中双击C#脚本进入VS内,发现相......
  • 海量数据存储Sharding-JDBC分库分表
    文章目录​​1.分库分表简介​​​​1.1.MySQL架构演变​​​​1.2.数据库性能优化思路​​​​1.3.分库分表带来的优点​​​​1.4.分库分表后的六大问题​​​​2.常见分......
  • 中小型系统必要可行的DevOps方案概述
    本文内容是个人针对实际工作中的问题,进行的一番思考、总结,供中小型公司进行DevOps实践时作一个思路上的参考,我觉得做事情,思路很重要,抛砖引玉...背景本文主要探讨中小型公......
  • centOS 中文乱码解决方案
    为什么会出现中文乱码在安装系统时,选择的系统语言为中文简体1.查看是否安装中文包可以使用下面的命名查看系统是否安装了中文安装包。locale-a|grep"zh_CN"结果:[root@k8s......
  • 一种基于 Python 的 Pscad 仿真数据处理方案
    起因在使用PsCad进行仿真的过程中,常常需要记录数据。PsCad会默认将仿真数据存储为.out文件和.inf文件。然而,这样的数据文件并不能直接导入到Python或者Matlab......
  • 高效节能 | 智慧灯杆综合管理解决方案
    智慧灯杆的应用越来越广泛,园区、景区、道路照明,三站一场等户外场所大规模铺设路灯,通过智慧物联平台远程控制,可以实现高效节能和智能化运维管理。以解决传统运维管理中,不同路......