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

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


为什么要分库分表

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

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

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

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

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

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

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

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

相关推荐
摇滚侠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 小时前
致软件新手的第一个项目指南:阶段、文档与破局之道
后端