水平分表
一、概念
水平分表:是为了解决单表记录数据过大引起的效率问题,通过HASH、分段等手段拆分,将大表化小的手段。
垂直分表:是将宽表变成几个窄表的手段,几个拆分前后的数据记录数未改变。通过将少量的重要字段剥离到窄表,让每个页容纳更多的行,减少跨页检索,减小磁盘扫描范围,达到提高效率的目的。
- 何时进行垂直拆分:
1.单表数据总量可能过千万。
2.字段超过20个
3.包含超长varchar、text、clob、blob等较占空间的类型字段。
- 哪些字段适合放在小表:
1.数据查询条件、排序用到的字段:商品id、商户id、分类编号、品牌编号、逻辑删除字段等。
2.高频访问的小子段:商品名、子标题、厂家信息、价格。
- 哪些字段适合放在大表:
1.低频访问字段:配送信息、售后申明、最后更新时间。
2.大字段:图文详情、图片Base64、Json元数据(特殊情况下某个大字段就需要单独存到一个表)。
二、innodb管理数据的机制:
row -> page(16KB) -> extent(1MB) -> segment -> table_space;
row:行,就是一条记录。
page:页,磁盘存储,固定大小为16KB,根据行数据大不同大小,存储若干连续的行。
extent:区,固定大小为1MB,也就是一个区只能保存64个连续的页。
segment:段。
table_space:表空间。
innodb1.0后提供了压缩页的技术,可以让每页物理上存储更多的逻辑数据。跨页检索数据时的解压缩效率不算高,所以做表设计时,要尽量的在一个页中存储更多的行数据,来减少跨页检索的次数,来提高数据检索效率。
垂直拆分前:每行占1KB,需要625万页来存储。
垂直拆分后:每行占64B,只需要39万页来存储。
查询时需要检索的数据页数相差16倍。
学习使我充实,分享给我快乐!