什么是垂直分表?
垂直分表指的是:表的记录并不多,但是字段却很长,表占用空间很大,检索表的时候需要执行大量的IO,严重降低了性能。这时需要把大的字段拆分到另一个表,并且该表与原表是一对一的关系。
如下图,是一个记录商品信息的表,共包含五个字段(商品ID
、商品名称
、商品价格
、商品图片
、商品描述
)
在实际的项目当中,展现给用户次数最频繁的字段应该是商品名称、图片以及价格等;而对于商品描述的信息,只有在用户对商品感到有兴趣并进行点击详情的操作时,用户才会看到该字段的信息。因此在这种情境下,我们可以将商品描述
这种占用空间较多,但访问不频繁的字段单独拆开来(如下)
像上图所示,将商品描述字段,拆开成为另一个表作为辅助表,并且在拆分出来的表中,增加一个记录主表主键ID的字段,当用户对该商品感兴趣并点击查看详情时,就可以主表的主键与该字段匹配,找到对应的商品描述,并呈现给用户。
实战一下
经过上面简单的讲解,相信各位读者朋友们以及对垂直分表有了一个最基本的了解,正所谓 ”趁热要打铁,趁火要打劫“ ,我们不妨针对垂直分表的知识点,进行一个小小的实战,加固自身对该知识的理解~!!
这里使用笔者在此前写过的个人商城网站做例子~!!
下图是用于做例子的商城网站主页,其中有一个新品推荐的模块,列出了多个商品(从图中我们可以获取到商品的 图片信息
、 商品名称
以及 价格
)
我们进入到其中一个商品的详情信息页面(如下图),这时我们能获取到比上一个页面更多的商品信息(商品名称
、商品价格
、商品状态
、商品库存
、商品描述
、所属店铺
)
此时,我们可以发现,对于 商品描述 这种访问频率不高,但占用空间大的字段,我们完全可以将其进行垂直分表的操作,使其与其他的字段拆分开来。说的多不如做的多,我们现在就马上行动起来~!!
首先我们需要看到没有进行垂直分表前表的结构(如下)
这里,我们只把占用空间较多的商品描述字段describe
拆分出来,使其与其他字段分别在不同的表中(拆分后的表名分别为sys_goods_master
、sys_goods_describe
,其中sys_goods_master
为主表,sys_goods_describe
为辅助表),拆分后的表结构如下:
sys_goods_master
主表与原来没有拆分的表相差不大,区别只是在于该表去除了大字段 商品描述describe
sys_goods_describe
商品描述表除了必要的字段(主键、商品描述内容)外,还需要一个用于记录与商品描述内容对应的商品主键ID,使两张表建立起联系~!
至此,我们就已经成功对该商品表
进行了垂直拆分
的操作~!!
总结
1.什么是垂直分表?
- 垂直分表指的是:表的记录并不多,但是字段却很长,表占用空间很大,检索表的时候需要执行大量的IO,严重降低了性能。这时需要把大的字段拆分到另一个表,并且该表与原表是一对一的关系。
2.为什么大字段IO效率低?
-
第一是由于数据量本身大,需要更长的读取时间
-
第二是跨页,页是数据库存储单位,很多查找及定位操作都是以页为单位,单页内的数据行越多数据库整体性能越好,而大字段占用空间大,单页内存储行数少,因此IO效率较低
-
第三,数据库以行为单位将数据加载到内存中,这样表中字段长度较短且访问频率较高,内存能加载更多的数据,命中率更高,减少了磁盘IO,从而提升了数据库性能
3.垂直分表的优点?
- 充分提高了”热点“数据的操作效率
- 磁盘争用情况减少
4.垂直分表的缺点?
- 依赖中间件
- 表的数量增多,对于表的维护复杂度也随之增加
好,下课~!!