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

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


为什么要分库分表

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

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

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

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

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

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

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

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

相关推荐
凡人的AI工具箱4 小时前
AI教你学Python 第11天 : 局部变量与全局变量
开发语言·人工智能·后端·python
是店小二呀4 小时前
【C++】C++ STL探索:Priority Queue与仿函数的深入解析
开发语言·c++·后端
canonical_entropy4 小时前
金蝶云苍穹的Extension与Nop平台的Delta的区别
后端·低代码·架构
我叫啥都行5 小时前
计算机基础知识复习9.7
运维·服务器·网络·笔记·后端
无名指的等待7125 小时前
SpringBoot中使用ElasticSearch
java·spring boot·后端
.生产的驴6 小时前
SpringBoot 消息队列RabbitMQ 消费者确认机制 失败重试机制
java·spring boot·分布式·后端·rabbitmq·java-rabbitmq
AskHarries6 小时前
Spring Boot利用dag加速Spring beans初始化
java·spring boot·后端
苹果酱05677 小时前
一文读懂SpringCLoud
java·开发语言·spring boot·后端·中间件
掐指一算乀缺钱7 小时前
SpringBoot 数据库表结构文档生成
java·数据库·spring boot·后端·spring
计算机学姐9 小时前
基于python+django+vue的影视推荐系统
开发语言·vue.js·后端·python·mysql·django·intellij-idea