数据量大的时候如何切分?
数据量大的时候如何切分?
提示
题眼: 水平切分,垂直切分。百库百表,有工作经验以后,比较常考
按位置切分:国家、省市城市时间切分:月份、季度、年份。垂直切分:如user表可以切分为账号基本信息user_basic和个人资料user_profile。水平切分:如订单数据量较大,按照日期切分成order_2020、order_2021、order_2022。
重要
参考答案:
数据量比较大的情况下,大致可以分成两种,水平切分和垂直切分。第一种是表里的数据量没有那么多,但是随着业务增长,字段变得特别的多,通常情况下,超过30个字段就要进行拆分。这种情况比较好做,把常用的字段放到一起,把不常用的放在另一张表里,彼此之间实现1对1映射就可以了,这个事垂直切。另一种情况就比较麻烦了,一张表的字段不多,但是随着业务增长,数据量猛增,这个时候要做的就是把一张表里的数据分配到多张表里,这个就是水平切。常用的方法其实也比较简单,就是取余,比如对100去余,然后按照余数0-99,分配到100张表里,这样子可以轻松容纳上亿的数据量,假设2000W的数据量,这样子拆分,一张表里也就20万数据。但是这样做也有一些麻烦的地方。
首先,就是不方便再进行排序了,因为数据分散了,没法做聚合排序了。另外就是对哪个ID 进行取余也是个很难取舍的情况,如果对用户ID取余,那有些用户数据多,有些干脆就是死号,那最后表里数据肯定不均匀,但要是对其他业务ID取余又会导致同一个用户的数据分赛再不同的表里,这样也不利于业务查询。所以,做切分的时候还是要以业务本身的需求为主。
我们公司DBA有个要求,一般表里数据到50W左右,就会建议做好切分的预案,数据量到200W上下,一般都要求拆分了。要么把原有数据当历史数据,开一个新表,要么就拆成10表 或者100表。按照DBA的说法,一张表的数据量如果特别大,还会拖累整个数据库其他表的性能。我自己也遇到这种问题,一张表里几千万的数据,执行一个COUNT都要好久,而且最后的数据还不太准确,因为执行时间里智能查到这么多数据,甚至还会报超时错误。
相关信息
引申:分表后想排序咋办?PDD是如何对订单进行分库分表的?
