前言
当数据库数据量大的时候,我们会考虑分库分表,但是在有些情况我们还会考虑垂直分表,比如这个表的字段过多,有几十个字段,我们就需要考虑垂直分表了,垂直分表解决了什么问题,接下来大家一起来看一下吧。
1、 innerDb 存储引擎结构
管理数据的基本单位页(page),管理页的单位为区(Extent),一个区由连续的页组成,一个页包含了连续的行,默认一个区有1M的存储空间,一个页默认16KB,一个区容纳64个页,在这个innerdb 中为了存储更多的页,对页进行了压缩,在跨页检索数据的时候压缩与解压缩效率并不是特别的高的,所以我们在设计数据库表的时候,每一个页要尽可能的多的存储行数据
2、实例分析
有一个商品表,字段有很多,我们将商品表拆分为商品基本信息表和商品详情信息表两个表,如下:
之前单表查询sql:
select * from 商品表 where 商品标题='xxxx'
差分完之后sql
select * from 商品基本信息表 a,商品基本信息表b where a.商品id=b.商品id and a.商品id='xxx'
假如有1亿的数据,假如没有索引,在没有垂直拆分的情况下,1k大小的行要存储625万页,遍历一行数据就要遍历625万页,如果做了拆分逻辑是这样的,他要先在39万页找到相关的数据,然后在根据id到详情表找到其它数据,然后在执行where条件。
mysql IO和页相关,遍历页越多,那么IO越多,效率越低,所以垂直拆分可以有效解决表字段多的行查询效率。
可能需要垂直分表的情况:
单表数据量未来可能千万,字段超过20个,且包含了很长的varchar等,高频访问的小字段放在小表里