1.水平分表

是为了解决单表数据过大引起效率问题,可以通过HASH、范围、取模邓手段拆分,将大表化小的手段

2.垂直分表

是将宽表变成几个窄表的手段,几个拆分前后的数据记录数未改变。通过将少量的重要字段剥离到窄表,让每个页容纳更多的行,减少跨页检索,减少磁盘扫描范围,达到高效的目的。

2.1 何时进行垂直拆分

  • 单标数据总量可能过千万
  • 字段超过20个
  • 包含超长varchar、text、clob、blob等占用空间的类型字段

2.2 那些字段适合放在小表

  • 数据查询条件、排序用到字段:商品ID、商户ID、分类编号、品牌编号、逻辑删除字段
  • 高频访问的字段:商品名、子标题、厂家信息、价格

2.3 哪些字段适合放在大表

  • 低频访问字段:配送信息、售后申明、最后更新时间
  • 大字段:图文详情、图片Base64\Json元数据

3.InnoDB 管理数据的机制

Row ->page(16K)->extent->segment->table space

  • row: 行 就是一条记录
  • page: 页,磁盘存储、固定大小为16KB,根据行数据不同大小,存储若干连续的行
  • extent: 区,固定大小为1MB ,也就是一个区只能保存64个连续的页
  • segment:段
  • table space: 表空间

innodb1.0后提供了压缩页的技术,可以让每页物理上存储更多的逻辑数据。跨页检索数据时的解压缩效率不算高,所以做表设计时,要尽量的在一个页中存储更多的行数据,来减少跨页检索的次数,来提高数据检索效率。

垂直拆分前:每行占1KB,需要625万页来存储。 垂直拆分后:每行占64B,只需要39万页来存储。 查询时需要检索的数据页数相差16倍。 image.png