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

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

相关推荐
终将老去的穷苦程序员10 小时前
基于SpringBoot的餐饮管理系统
java·spring boot·后端
张忠琳10 小时前
【Go 1.26.4】Golang Map 深度解析
开发语言·后端·golang
一条泥憨鱼10 小时前
Java开发效率神器:Lombok从入门到精通!
java·后端·学习·开发·lombok
熠熠仔10 小时前
Spring Boot 与 MyBatis-Plus 空间几何数据集成指南
spring boot·后端·mybatis
AI 小老六10 小时前
Google AX 控制面拆解:分布式 Agent 如何把断点恢复、审计策略和执行调度收进同一条链路
人工智能·分布式·后端·ai·架构·ai编程
YHHLAI11 小时前
从零搭建一个 RESTful Todo 服务 —— Bun + TypeScript 全栈最小闭环
后端·typescript·restful
小闹54911 小时前
一个 65 行的小需求,我让 Claude Code 跑了 25 个 agent、整整两小时
后端·claude
天青色等烟雨..11 小时前
智慧农林核心遥感技术99个案例实践
运维·人工智能·spring boot·后端·自动化
西安邮电大学11 小时前
贪心算法详细讲解
java·后端·其他·算法·面试
橙序员小站11 小时前
从"夯"到"拉":谷歌苹果华为开发者大会,谁在裸泳?
人工智能·后端