前言

当数据库数据量大的时候,我们会考虑分库分表,但是在有些情况我们还会考虑垂直分表,比如这个表的字段过多,有几十个字段,我们就需要考虑垂直分表了,垂直分表解决了什么问题,接下来大家一起来看一下吧。

1、 innerDb 存储引擎结构

管理数据的基本单位页(page),管理页的单位为区(Extent),一个区由连续的页组成,一个页包含了连续的行,默认一个区有1M的存储空间,一个页默认16KB,一个区容纳64个页,在这个innerdb 中为了存储更多的页,对页进行了压缩,在跨页检索数据的时候压缩与解压缩效率并不是特别的高的,所以我们在设计数据库表的时候,每一个页要尽可能的多的存储行数据

MYSQL 表某个字段横向变成纵向_字段

2、实例分析

有一个商品表,字段有很多,我们将商品表拆分为商品基本信息表和商品详情信息表两个表,如下:

MYSQL 表某个字段横向变成纵向_字段_02


之前单表查询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等,高频访问的小字段放在小表里