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

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


为什么要分库分表

一般接口出现性能问题的话,大多是因为数据库出现了瓶颈造成的。比如当一个表数据很大的时候,查询效率就会变得很慢,即使增加了索引也不能解决这个问题。或者当并发量比较大的时候,也会有大量的数据库请求,数据库请求会占用IO资源,也会造成性能问题。在出现这些问题的时候要怎么办呢?就用到了分库分表。

分库分表有哪些应用场景呢

分库和分表是不同的两个概念,它们解决的问题也不同。比如当并发量很大但是数据量很小的时候,这个时候单个服务器的IO操作就会增大,从而出现瓶颈。然后我们可以分库,把数据分到两个或者多个服务器上,这样就解决了单个服务器IO很大的问题,只需要分库不需要分表就可以解决。将库放到不同的服务器上,减少单台服务器的IO操作。当并发量不大但是数据很多的时候,虽然表有锁冲突,但是可能也是很缓慢的,这个时候就要把数据分布到不同的表中,减少单个表的压力,这时只需要分表不需要分库就可以解决。最后是当并发量很大且数据量也很大的时候,这个时候就要结合操作,既要分库又要分表才能起到优化的作用。

在确定了是分库还是分表之后,就要考虑如何拆分了。分库分表有两个方向,一个是垂直,一个是水平。在选择是垂直拆分还是水平拆分的时候,一般是先垂直拆分再水平拆分,因为垂直拆分更符合实际的业务需求。 为什么符合实际业务呢?下面让我们来看一下。先垂直分库,垂直分库就是针对一个系统中不同的业务进行拆分,比如把用户拆到user库,把订单拆到order库。拆分后放到不同的服务器上独立部署,让它们互相不影响。这样在高并发的情况下,一定程度上能解决IO连接数、硬件资源等瓶颈。

上面这张图,刚一开始是一个DB,下边的这些用户、订单和商品相关表都放在这一个DB上。垂直拆分之后,就是把用户单独放在服务器一上,订单放在服务器二上,商品放在服务器三上。这样就减少了一台服务器的压力。

再来看上边更直观的图,查询从user表中获取数据,刚一开始都是全从这一个服务器上来获取的。垂直拆分之后,user就在这个服务器上,order就在那个服务器上获取,这样就把压力给拆分了。

垂直分表,也就是大表拆小表,基于表中的字段拆分。将不常用的数据、比较大的数据拆分到扩展表。一般针对几百列的大表进行拆分。

看一下上面这个表,拆分前,用户ID、姓名、密码、性别、年龄、手机号等等,这一堆都保存在一个大表中。实际上,只有用户名和密码用得比较频繁,比如登录和注册的时候,经常用这两个字段,其余的像地址、微信、注册时间都很少用。当登录的时候,把这些都获取一下就会造成浪费。这个时候,我们来给它垂直拆分,把常用的用户名和密码单独拆分出来,放到userbase表中,把剩下的不常用的都放到userinfo表中。这样当用户登录时,就直接访问userbase表就可以满足了,只有当进入用户中心访问基本信息的时候,才会访问到userinfo表。但是做这种请求的行为就会少很多,这样就达到了优化的目的。

相关推荐
hrhcode7 小时前
【Netty】五.ByteBuf内存管理深度剖析
java·后端·spring·springboot·netty
NEXT068 小时前
后端跑路了怎么办?前端工程师用 Mock.js 自救实录
前端·后端·程序员
泯泷8 小时前
提示工程的悖论:为什么与 AI 对话比你想象的更难
人工智能·后端·openai
马士兵教育10 小时前
程序员简历如何编写才能凸显出差异化,才能拿到更多面试机会?
开发语言·后端·面试·职场和发展·架构
无心水12 小时前
5、微服务快速启航:基于Pig与BladeX构建高可用分布式系统实战
服务器·分布式·后端·spring·微服务·云原生·架构
米羊12113 小时前
Struts 2 漏洞(下)
java·后端·struts
若丶相见13 小时前
腾讯云完整部署方案:CODING + CI/CD + Docker + Nginx + K8s 扩展
前端·后端
Je1lyfish15 小时前
CMU15-445 (2026 Spring) Project#1 - Buffer Pool Manager
linux·数据库·c++·后端·链表·课程设计·数据库架构
hrhcode16 小时前
【Netty】三.ChannelPipeline与ChannelHandler责任链深度解析
java·后端·spring·springboot·netty
树獭叔叔16 小时前
高级微调调优:NEFTune 鲁棒性增强与 RoPE 长度外推
后端·aigc·openai