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