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

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


为什么要分库分表

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

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

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

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

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

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

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

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

相关推荐
IT策士35 分钟前
Django 从 0 到 1 打造完整电商平台:商品排序与浏览量统计
后端·python·django
万少1 小时前
万少的 Claude Code 入门教程
前端·人工智能·后端
malog_1 小时前
Milvus向量数据库:AI时代的搜索革命
数据库·人工智能·后端·milvus
invicinble1 小时前
springboot提供的机制大全
java·spring boot·后端
zhangxingchao1 小时前
AI 大模型面试核心二:微调、RAG、MCP、Agent 与工程落地
前端·人工智能·后端
IT策士1 小时前
Django 从 0 到 1 打造完整电商平台:商品搜索
后端·python·django
zhangxingchao1 小时前
AI 大模型面试核心三: RAG、Agent 到 Prompt Engineering 的工程化理解
前端·人工智能·后端
彦为君1 小时前
JavaSE-11-ByteBuffer(NIO核心组件)
java·开发语言·前端·数据库·后端·spring·nio
刀法如飞2 小时前
《理解道德经》简单版-第 1 章:道可道,非常道
前端·后端·面试
浩风祭月2 小时前
我用 Cursor 把一个订单状态机从 800 行重构到 120 行,且逻辑零差错
前端·后端