1.为什么要分表
分表的目地是缩小查询时间,减少数据库负担 . 数据库如果数据量太大 只是加索引效果不大
mysql中有一种机制是表锁定和行锁定,是为了保证数据的完整性。表锁定表示你们都不能对这张表进行操作,必须等我对表操作完才行。行锁定也一样,别的sql必须等我对这条数据操作完了,才能对这条数据进行操作。
2.判断表数据容量已满
可以在程序中对于要新增数据的表,在插入前先做统计表记录数量的操作,当<xxx条数据,就直接插入,当已经到达阀值,可以在程序中新创建数据库表(或者已经事先创建好),再执行插入操作。
3.大量数据分表
用merge存储引擎来实现分表
4.垂直分区
如果把业务切割得足够独立,那把不同业务的数据放到不同的数据库服务器将是一个不错的方案,而且万一其中一个业务崩溃了也不会影响其他业务的正常进行,并且也起到了负载分流的作用,大大提升了数据库的吞吐能力:
但是这种不能解决根本问题
垂直(纵向)拆分:是指按功能模块拆分,以解决表与表之间的io竞争。比如分为订单库、商品库、用户库…这种方式多个数据库之间的表结构不同。
5.水平分片
将用户按一定规则(按id哈希)分组,并把该组用户的数据存储到一个数据库分片中,即一个sharding,这样随着用户数量的增加,只要简单地配置一台服务器即可,原理图如下:
确定某个用户所在的shard,可以建一张用户和shard对应的数据表,每次请求先从这张表找用户的shard id,再从对应shard中查询相关数据
水平(横向)拆分:将同一个表的数据进行分块保存到不同的数据库中,来解决单表中数据量增长出现的压力。这些数据库中的表结构完全相同。