PHP中的数据存储 MySQL分库分表 (下)

年关将至,工作上也没什么大的安排。闲暇时间从一个PHP工程师的角度去学习一下微服务架构,毕竟谁都想进步嘛,哇哈哈


垂直拆分有哪些优缺点

先看一下它的特点。每一个库表结构都是不一样的,每一个库表,它的数据至少有一列是一样的,因为它需要经过这一列来关联,比如说刚才都是通过user ID来关联的。第三个就是每一个库表,它的并级,就是全量数据。优点是什么呢?因为它是按照业务拆分的,所以拆分后业务逻辑就会更加清晰。另外,按照业务拆分之后,数据就会按照业务保存在不同的服务器上,这样数据维护就会比较简单。那么缺点是什么呢?因为它只是根据字段来拆分了,所以当单表数据量大时,问题还是没有解决,因为每个表中数据还是那么多,比如说有1000万表拆分成了若干小表,每个小表中还是有1000万条数据。另外一个就是它受业务的影响,热门业务压力比较大,冷门的业务就会造成资源浪费,比如说用户业务比较大,那么用户的服务器压力会比较大,而另外有一个积分的业务,如果比较冷门,那么这台服务器几乎就没有什么压力,也没有什么访问,就造成了资源的浪费。

水平拆分

再来看下水平拆分。水平分表是针对数据量巨大的单表,按照某种规则拆分到多个表中,但是这些表还是在一个库中。水平分库分表它都是按照某种规则来的,把拆分的表再拆到不同的库中去。看一下规则,先看第一个,按照范围拆分,比如0-1万的放到一个表,10001-2万的放到一个表,然后是通过哈希取模来拆分,比如说通过用户ID来取模,最简单的就是ID除以10,直接分到了10个表中。另外还有根据地理区域分的,一般做云的这种区分呢会比较多,还有根据时间拆分的,比如说将6个月前的数据拆出去放到一个表中,随着时间的流逝,这些表中的数据查询的几率很小,这个也就是冷热数据的分离。

再通过上边的两张图来看一下水平拆分。左边这张图,优则表刚一开始是一个服务器,然后根据ID,0-1万放到服务器一上,10001-2万放到服务器二上,20001-3万放到服务器三上进行拆分。查询的时候,刚一开始where ID等于2的都到了服务器以上拆分完之后,查询where ID等于一的就请求服务器一,等于ID等于2的时候通过2取模等于0的就访问0这台服务器,这个就是水平拆分和垂直拆分对比,还是这张表u表他是怎么拆分的呢?他并没有根据字段来拆分开,拆分成了两个表u表1和u表2,结构是一样的。拆分完之后程序几乎不用动,改动会很小,而且数据扩容难度大,比如说取模的值由2变成了10,这个时候旧数据都要全部重新再处理一遍,因为不同的取模,它落到的库是不一样的,但是刚才讲的一致性哈希算法有效的解决了这个问题。

关于分库分表就讲到这里。

相关推荐
Aerkui5 分钟前
Go 泛型(Generics)详解
开发语言·后端·golang
clive.li7 分钟前
go-webmvc框架推荐
开发语言·后端·golang
树獭叔叔13 分钟前
从向量到文字:Transformer 的预测与输出(LM Head)
后端·aigc
橙序员小站29 分钟前
架构图不再手画:用 LikeC4 + AI,让架构“活”起来
后端·架构
JavaGuide1 小时前
又一款国产开源企业级文件管理系统诞生了!基于 Spring Boot 3.5.x + Sa-Token + MyBatis Flex
后端·github
大鹏19881 小时前
Go 实战 LeetCode 151:高效翻转字符串中的单词(含空格处理技巧)
后端
花果山总钻风1 小时前
SQLAlchemy各种排序示例
后端·python·中间件
uzong2 小时前
管理者不要被琐事耗尽心力
后端
最贪吃的虎2 小时前
windows上如何可视化访问并远程操作linux系统上运行的浏览器或者linux可视化桌面
java·linux·运维·windows·分布式·后端·架构