天天看点

数据库与分区、分表、分库

分区:(应用层感知不到变化)

将把一张表的数据根据分区逻辑均衡分摊到多个存储介质中。在逻辑上看还是只有一张表,但实际被分成了N个物理块。分区类型有(range、list、hash、key)。

主要解决单表数据量过大,读写数据、修改数据时重建索引效率等问题。

一般当一张表的查询,在优化后,查询速度仍比较慢时,就需要选择合适的业务字段进行分区。

相对分表,几乎无工作量。应用端一般无需修改代码。

分表:mycat、tidb

把一张表按一定规则,拆分成N张表的过程。分横向拆分和纵向拆分。

横向拆分:

将一张表中的不同数据字段,拆分到2张或者多张表中。一般横向拆分的情况有:表字段过多,字段内容过大(如text,blob等),不经常使用等。

纵向拆分:

将数据打散到多张结构相同的表中存储。

如流水表,我们选择以用户id取余分表。因为在业务上流水只和用户相关,选择根据用户id取余分表很合适。

需求:查看当天或者某段时间的充值总量,消费总量等:

运营系统的需求,对查询时效性要求不是很高,我们采用先再每张表中查数据,将查询出的数据放入临时表中,最后在临时表中查询最终数据。(其实,早期我们的做法是单独做了张运营表,各个分表的数据,在运营表中都有汇总。这种方式,在数据量逐渐增大后,查询也越来越慢。)

分库:

分库,一般是根据业务耦合性,将关联度低的不同表存储在不同的数据库中。(比如,流水库,视频库)

分库后,不同库之间不能进行关联查询,可以通过字段冗余进行解决。如果冗余无法满足需求,也可以考虑将小表数据,全表冗余到该分库中。