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

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

相关推荐
mit6.82417 分钟前
[Docker#5] 镜像仓库 | 命令 | 实验:搭建Nginx | 创建私有仓库
linux·后端·docker·云原生
友大冰2 小时前
Go 语言已立足主流,编程语言排行榜24 年 11 月
开发语言·后端·golang
hummhumm3 小时前
第 10 章 - Go语言字符串操作
java·后端·python·sql·算法·golang·database
湫qiu4 小时前
stream().toList()的大坑,你真的了解吗
java·后端
man20175 小时前
【2024最新】基于springboot+vue的闲一品交易平台lw+ppt
vue.js·spring boot·后端
hlsd#5 小时前
关于 SpringBoot 时间处理的总结
java·spring boot·后端
路在脚下@5 小时前
Spring Boot 的核心原理和工作机制
java·spring boot·后端
幸运小圣5 小时前
Vue3 -- 项目配置之stylelint【企业级项目配置保姆级教程3】
开发语言·后端·rust
前端SkyRain6 小时前
后端Node学习项目-用户管理-增删改查
后端·学习·node.js
提笔惊蚂蚁6 小时前
结构化(经典)软件开发方法: 需求分析阶段+设计阶段
后端·学习·需求分析