MySQL垂直分表原理讲解

什么是垂直分表?

垂直分表指的是:表的记录并不多,但是字段却很长,表占用空间很大,检索表的时候需要执行大量的IO,严重降低了性能。这时需要把大的字段拆分到另一个表,并且该表与原表是一对一的关系。

如下图,是一个记录商品信息的表,共包含五个字段(商品ID商品名称商品价格商品图片商品描述

在实际的项目当中,展现给用户次数最频繁的字段应该是商品名称、图片以及价格等;而对于商品描述的信息,只有在用户对商品感到有兴趣并进行点击详情的操作时,用户才会看到该字段的信息。因此在这种情境下,我们可以将商品描述这种占用空间较多,但访问不频繁的字段单独拆开来(如下)

像上图所示,将商品描述字段,拆开成为另一个表作为辅助表,并且在拆分出来的表中,增加一个记录主表主键ID的字段,当用户对该商品感兴趣并点击查看详情时,就可以主表的主键与该字段匹配,找到对应的商品描述,并呈现给用户。


实战一下

经过上面简单的讲解,相信各位读者朋友们以及对垂直分表有了一个最基本的了解,正所谓 ”趁热要打铁,趁火要打劫“ ,我们不妨针对垂直分表的知识点,进行一个小小的实战,加固自身对该知识的理解~!!

这里使用笔者在此前写过的个人商城网站做例子~!!

下图是用于做例子的商城网站主页,其中有一个新品推荐的模块,列出了多个商品(从图中我们可以获取到商品的 图片信息商品名称 以及 价格


我们进入到其中一个商品的详情信息页面(如下图),这时我们能获取到比上一个页面更多的商品信息(商品名称商品价格商品状态商品库存商品描述所属店铺


此时,我们可以发现,对于 商品描述 这种访问频率不高,但占用空间大的字段,我们完全可以将其进行垂直分表的操作,使其与其他的字段拆分开来。说的多不如做的多,我们现在就马上行动起来~!!

首先我们需要看到没有进行垂直分表前表的结构(如下)

这里,我们只把占用空间较多的商品描述字段describe拆分出来,使其与其他字段分别在不同的表中(拆分后的表名分别为sys_goods_mastersys_goods_describe,其中sys_goods_master为主表,sys_goods_describe为辅助表),拆分后的表结构如下:


sys_goods_master

主表与原来没有拆分的表相差不大,区别只是在于该表去除了大字段 商品描述describe


sys_goods_describe

商品描述表除了必要的字段(主键、商品描述内容)外,还需要一个用于记录与商品描述内容对应的商品主键ID,使两张表建立起联系~!

至此,我们就已经成功对该商品表进行了垂直拆分的操作~!!


总结

1.什么是垂直分表?

  • 垂直分表指的是:表的记录并不多,但是字段却很长,表占用空间很大,检索表的时候需要执行大量的IO,严重降低了性能。这时需要把大的字段拆分到另一个表,并且该表与原表是一对一的关系。

2.为什么大字段IO效率低?

  • 第一是由于数据量本身大,需要更长的读取时间

  • 第二是跨页,页是数据库存储单位,很多查找及定位操作都是以页为单位,单页内的数据行越多数据库整体性能越好,而大字段占用空间大,单页内存储行数少,因此IO效率较低

  • 第三,数据库以行为单位将数据加载到内存中,这样表中字段长度较短且访问频率较高,内存能加载更多的数据,命中率更高,减少了磁盘IO,从而提升了数据库性能

3.垂直分表的优点?

  • 充分提高了”热点“数据的操作效率
  • 磁盘争用情况减少

4.垂直分表的缺点?

  • 依赖中间件
  • 表的数量增多,对于表的维护复杂度也随之增加

好,下课~!!

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云丶言

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值