是一种数据分片技术,主要分为垂直拆分和水平拆分。垂直拆分的意思是,把部分字段及其值挪到其它表或者其它数据库实例中;水平拆分的意思是,把部分记录挪到其它表或者其它数据库实例中;
单表的存储总是有上限的,并且随着单表中数据量和字段数的增长,查询效率会越来越低,无法满足正常的查询时效要求。因此需要将数据进行分片,实现降低单表中数据行数、字段个数的目标,保持单表查询效率。
以MySQL为例,单表存储的上限MySQL本身并没有做限制,它是和操作系统所允许的最大文件大小有关的,单表中字段数量越多,行数越多,那么就会使得单表的存储大小越大,一旦单表总大小超过操作系统的限制了,那么就达到了存储上限。
同上,和操作系统所允许的最大文件大小有关的。
为了提高性能,表的索引会被加载到内存中,如果表中数据不多的时候,索引能被全部一次性加载到内存中,查询效率都是OK的。但是如果表中数据超过某一个阈值,使得该表的索引太大超过内存限制,不能被一次性加载到内存中了,此时如果查找表中数据,会使得多次磁盘IO加载索引,从而导致查询效率大幅下降。
按照业界的通用建议,如果表中数据行数超过500万时,可以考虑分库分表了;如果超过1000万的时候,就建议进行分库分表了。
如果数据量没有达到500万行或者2G大小的时候,可以先不用考虑分库分表。
分库分表其实是两个操作,我们可以只选择其中之一,也可以两者结合起来使用。分库指的是将表中的部分数据挪到其它数据库实例中进行存储,分表指的是在同一数据库实例中用另外一张表来存储部分数据。每一种操作都包含垂直拆分和水平拆分两种方式。
垂直拆分,就是将表中的部分字段及其值从该表中移出去,放到别的表或者别的数据库实例中。
一般而言,优先考虑垂直拆分,尽量分到同一个数据库实例的不同表中。
水平拆分,就是将表中的部分记录行从该表中移出去,放到别的表或者别的数据库实例中。
水平拆分的核心就是路由算法:
水平拆分的具体实施方案分为两种: