最超值的赣州网站建设,建一个网站的步骤,如何在本地发布自己做的网站,用vs做网站如何连接数据库文章目录垂直分表拆分方法举例垂直分库水平分表水平分库小结垂直角度#xff08;表结构不一样#xff09;水平角度#xff08;表结构一样#xff09;垂直分表
需求#xff1a;商品表字段太多#xff0c;每个字段访问频次不⼀样#xff0c;浪费了IO资源#xff0c;需要…
文章目录垂直分表拆分方法举例垂直分库水平分表水平分库小结垂直角度表结构不一样水平角度表结构一样垂直分表
需求商品表字段太多每个字段访问频次不⼀样浪费了IO资源需要进行优化 也就是“大表拆小表”基于列字段进行的
拆分方法
⼀般是表中的字段较多将不常用的或者数据较大长度较长的拆分到扩展表如text类型字段访问频次低、字段大的商品描述信息单独存放在⼀张表中访问频次较高的商品基本信息单独放在⼀张表中把不常用的字段单独放在⼀张表 把textblob等大字段拆分出来放在附表中业务经常组合查询的列放在⼀张表中
举例
//拆分前
CREATE TABLE product (id int(11) unsigned NOT NULL AUTO_INCREMENT,title varchar(524) DEFAULT NULL COMMENT 视频标题,cover_img varchar(524) DEFAULT NULL COMMENT 封⾯图,price int(11) DEFAULT NULL COMMENT 价格,分,total int(10) DEFAULT 0 COMMENT 总库存,left_num int(10) DEFAULT 0 COMMENT 剩余,learn_base text COMMENT 课前须知学习基础,learn_result text COMMENT 达到⽔平,summary varchar(1026) DEFAULT NULL COMMENT 概述,detail text COMMENT 视频商品详情,PRIMARY KEY (id)
) ENGINEInnoDB AUTO_INCREMENT1 DEFAULT CHARSETutf8;//拆分后
CREATE TABLE product (id int(11) unsigned NOT NULL AUTO_INCREMENT,title varchar(524) DEFAULT NULL COMMENT 视频标题,cover_img varchar(524) DEFAULT NULL COMMENT 封⾯图,price int(11) DEFAULT NULL COMMENT 价格,分,total int(10) DEFAULT 0 COMMENT 总库存,left_num int(10) DEFAULT 0 COMMENT 剩余,PRIMARY KEY (id)
) ENGINEInnoDB AUTO_INCREMENT1 DEFAULT CHARSETutf8;CREATE TABLE product_detail (id int(11) unsigned NOT NULL AUTO_INCREMENT,product_id int(11) DEFAULT NULL COMMENT 产品主键,learn_base text COMMENT 课前须知学习基础,learn_result text COMMENT 达到⽔平,summary varchar(1026) DEFAULT NULL COMMENT 概述,detail text COMMENT 视频商品详情,PRIMARY KEY (id)
) ENGINEInnoDB AUTO_INCREMENT1 DEFAULT CHARSETutf8;垂直分库
需求C端项目里面单个数据库的CPU、内存长期处于90%的利用率数据库连接经常不够需要进行优化
垂直分库针对的是⼀个系统中的不同业务进行拆分 数据库的连接资源比较宝贵且单机处理能力也有限没拆分之前全部都是落到单⼀的库上的单库处理能力成为瓶颈还有磁盘空间内存tps等限制拆分之后避免不同库竞争同⼀个物理机的CPU、内存、网络IO、磁盘所以在高并发场景下垂直分库⼀定程度上能够突破IO、连接数及单机硬件资源的瓶颈垂直分库可以更好解决业务层面的耦合业务清晰且方便管理和维护
⼀般从单体项目升级改造为微服务项目就是垂直分库 但是垂直分库分表可以提高并发但是依然没有解决单表数据量过大的问题
水平分表
需求当⼀张表的数据达到几千万时查询⼀次所花的时间长需要进行优化缩短查询时间
把⼀个表的数据分到⼀个数据库的多张表中每个表只有这个表的部分数据核心是把⼀个大表分割N个小表每个表的结构是⼀样的数据不⼀样全部表的数据合起来就是全部数据针对数据量巨⼤的单张表比如订单表按照某种规则RANGE,HASH取模等切分到多张表里面去但是这些表还是在同⼀个库中所以单数据库操作还是有IO瓶颈主要是解决单表数据量过⼤的问题减少锁表时间没分表前如果是DDL(create/alter/add等)语句当需要添加⼀列的时候mysql会锁表期间所有的读写操作只能等待 水平分库
需求高并发的项目中水平分表后依旧在单个库上面1个数据库资源瓶颈 CPU/内存/带宽等限制导致响应慢需要进行优化
把同个表的数据按照⼀定规则分到不同的数据库中数据库在不同的服务器上水平分库是把不同表拆到不同数据库中它是对数据行的拆分不影响表结构每个库的结构都⼀样,但每个库的数据都不⼀样没有交集所有库的并集就是全量数据水平分库的粒度比水平分表更大
小结
垂直角度表结构不一样
垂直分表: 将⼀个表字段拆分多个表每个表存储部分字段 好处 1. 避免IO时锁表的次数分离热点字段和⾮热点字段避免⼤字段IO导致性能下降 原则 1. 业务经常组合查询的字段⼀个表不常⽤字段⼀个表text、blob类型字段作为附属表
垂直分库根据业务将表分类放到不同的数据库服务器上 好处 1. 避免表之间竞争同个物理机的资源比如CPU/内存/硬盘/网络IO 原则 1. 根据业务相关性进行划分领域模型微服务划分⼀般就是垂直分库
水平角度表结构一样
水平分库把同个表的数据按照⼀定规则分到不同的数据库中数据库在不同的服务器上 好处 1. 多个数据库降低了系统的IO和CPU压力
原则 1. 选择合适的分片键和分片策略和业务场景配合 2. 避免数据热点和访问不均衡、避免⼆次扩容难度大
水平分表同个数据库内把⼀个表的数据按照⼀定规则拆分到多个表中对数据进⾏拆分不影响表结构
单个表的数据量少了业务SQL执行效率⾼降低了系统的IO和CPU压力 原则1. 选择合适的分片键和分片策略和业务场景配合 2. 避免数据热点和访问不均衡、避免⼆次扩容难度大