什么是垂直分表?

垂直分表指的是:表的记录并不多,但是字段却很长,表占用空间很大,检索表的时候需要执行大量的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.垂直分表的缺点?

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

好,下课~!!

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐