单表超大数据量处理-水平切割法

187 阅读2分钟

MySQL分表

MySQL环境中,单表建议容量不超过千万条,否则查询效率会有较大影响。在常规的索引、读写分离、合理sql等方法都用上之后,剩下的方法就是分区分表,分表(sharding)就是水平切割。
图片
mysql5.1版本开始,提供 分区(PARTITION)功能,也是对表数据进行切分你的方法之一。分表是把一张大表拆成N张小表;分区是把一张大表的数据分别存储在若干个区块上,仍然还是一张表。

分表策略一般有几类

范围分区

数字id可以按照数字范围切分,比如上图所示,ID为11000w的,放在第一个节点上;100000012000w的,放在第二节点上,依次类推。这种方法的好处是方便检索,按id查能够快速定位到那个节点,扩容也方便,增加一个节点就好了;不好的地方是数据不均匀,最后一个节点由于数据比较热,访问的频次会非常大。

取模均衡分区

为了解决数据热点问题,可以采用取模的方式,进行切分。一般设置2n个节点,对数字的2n取模。这种方法的好处是起到负载均衡的作用,热点数据会均衡的散落在各个节点中。坏处是扩容比较费劲,不能随意扩容,只能进行双倍扩容,否则需要进行重新sharding。

日期范围分区

如果是日志类的数据,可以按照日期进行切分。

Hash散列分区

非数字的ID进行水平切分,只需要对id进行hash一下,然后对hash值进行2^n取模,就得到分片节点编号了。

总结

表分区基本上就这集中办法,范围分区、取模、hash。核心思想就是把数据均匀的分配到若干区域中,避免造成各种数据热点问题。对应的,在计算时就是数据倾斜问题。