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,这个时候旧数据都要全部重新再处理一遍,因为不同的取模,它落到的库是不一样的,但是刚才讲的一致性哈希算法有效的解决了这个问题。

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

相关推荐
摇滚侠2 小时前
Spring Boot 3零基础教程,IOC容器中组件的注册,笔记08
spring boot·笔记·后端
程序员小凯5 小时前
Spring Boot测试框架详解
java·spring boot·后端
你的人类朋友5 小时前
什么是断言?
前端·后端·安全
程序员小凯6 小时前
Spring Boot缓存机制详解
spring boot·后端·缓存
i学长的猫7 小时前
Ruby on Rails 从0 开始入门到进阶到高级 - 10分钟速通版
后端·ruby on rails·ruby
用户21411832636027 小时前
别再为 Claude 付费!Codex + 免费模型 + cc-switch,多场景 AI 编程全搞定
后端
茯苓gao7 小时前
Django网站开发记录(一)配置Mniconda,Python虚拟环境,配置Django
后端·python·django
Cherry Zack7 小时前
Django视图进阶:快捷函数、装饰器与请求响应
后端·python·django
爱读源码的大都督8 小时前
为什么有了HTTP,还需要gPRC?
java·后端·架构
码事漫谈8 小时前
致软件新手的第一个项目指南:阶段、文档与破局之道
后端