当一个数据库被创建之后,随着时间的推移和业务量的增加,数据库中的表以及表中的数据量都会越来越多,就有可能会出现两种弊端: (1)数据库的存储资源是有限的,其负载能力也是有限的,数据的大量积累肯定会导致其处理数据的能力下降; (2)数据量越多,那么对数据的增删改查等操作的开销也会越来越大; 所以,当出现如上两种情况,分库分表势在必行。
举例场景:表的记录并不多,但是字段却很长,表占用空间很大,检索表的时候需要执行大量的IO,严重降低了性能。这时需要把大的字段拆分到另一个表,并且该表与原表是一对一的关系。
学生答题表 t 结构如下
列名 | 注释 |
---|---|
id | 答题表id |
name | 学生名 |
fraction | 得分 |
answer | 答案 |
… | … |
其中answer是以特定格式来储存的字符 如: A|B|C|C|C|D|D|D|A|B|B|填空一|填空二|其他算数题….
对于常用的列表来说,一般只查看姓名和总分数,对于具体的答案等字段很少需要查看,所以可以考虑把答案拆分成一张独立的表。 通过id与t表建立一对一的关系,同样将回答单独放到一张表中。这样我们插叙t中的分数的时候就不会扫描回答等不常用字段了。
若有些场景需要所有字段都查询出,可以使用join或者分次查询再合并结果。
再以一个实例代码示范 将订单拆分成订单主要信息表、订单附加信息表,两种信息都需要的情况再join,如果是单条信息,则也可以单独用id查询附加信息等。
当表的列并不复杂,数量却很多,如用户表。假设有一千万条用户信息,如果只有一张表,每个用户登录的时候数据库都要从这一千万中查找,会很慢很慢。哪怕你建立了索引。
但如果将表以一定规则分割成10个表,则每个表只有百万条数据,就小了很多了,表命名一般可以为table_1,table_2等等
水平切分的规则常见有:id取模、添加时间等
id取模:可以将用户的id%100(这个数是你想要分成多少个表),那么会得到0-99的数,查询表的时候,将表名qq跟取模的数连接起来,就构建了表名。比如123456789用户,取模的89,那么就到table_89表查询
添加时间:以下用一条代码实例示范