知识卡片

分表的两种方式:垂直分表与水平分表的蛋糕类比

普通读书笔记卡

内容

业务分库解决的是不同业务数据分散存储的问题,但如果单个业务本身的数据量继续膨胀(比如淘宝几亿用户数据全放一张表),单表还是会撑到单机性能极限,这时就需要对单表本身做拆分,方式分为垂直分表和水平分表两类,可以用切蛋糕来直观理解两者的区别:从上往下切(刀的运行轨迹与蛋糕垂直)得到的是垂直切分,切出来的两块蛋糕高度相同、面积不一定相同,对应到表结构上就是”记录数相同,但每份包含的列不同”——比如把一张表切成一个包含ID/name/age/sex的表和另一个包含ID/nickname/description的表;从左往右切(刀的运行轨迹与蛋糕平行)得到的是水平切分,切出来的两块蛋糕面积相同、高度不一定相同,对应到表结构上就是”列相同,但每份包含的行不同”——比如把同一张表按ID 1~999999和ID 1000000~9999999拆成两张结构完全一样的表。切分的次数不受限制,可以只切一次,也可以像切蛋糕一样反复切很多刀。单表拆成多表后,是否要进一步分散到不同数据库服务器,并不是强制要求,而要看实际效果:即使新表仍留在同一台数据库服务器上,拆分本身往往也能带来可观的性能提升,只要能满足业务需要就没必要额外承担业务分库那一整套复杂性;只有拆完之后单机性能仍不够用,才需要再进一步做业务分库。垂直分表适合把不常用、但占用大量存储空间的列单独拆出去——比如婚恋网站用户表里,用户筛选主要靠age和sex两个字段查询,而nickname和description主要用于展示、不会出现在筛选条件里,且description本身通常较长,把这两个字段独立成一张表,能让age/sex的查询明显变快;代价是原本一次查询能拿到的字段现在要拆成两次查询才能凑齐,但相比水平分表,这点复杂性只能算”小巫见大巫”。

参考来源

- 位置:《从零开始学架构》第15讲《高性能数据库集群:分库分表》"分表"之"垂直分表"(源文件:_epub-src/OEBPS/text00001.html) - 结论依据:原文以切蛋糕类比解释"从上往下切就是垂直切分……对应到表的切分就是表记录数相同但包含不同的列……从左往右切就是水平切分……对应到表的切分就是表的列相同但包含不同的行数据",并说明垂直分表"适合将表中某些不常用且占了大量空间的列拆分出去……引入的复杂性主要体现在表操作的数量要增加",直接支撑本卡片结论。 - 原始内容:从上往下切就是垂直切分……对应到表的切分就是表记录数相同但包含不同的列……垂直分表适合将表中某些不常用且占了大量空间的列拆分出去……垂直分表引入的复杂性主要体现在表操作的数量要增加。