什么是水平分表?
当一张表到达一定的数据量后(如500万条数据),索引的成本也随之增加,使用主键索引查找数据时也显得十分吃力,数据检索效率低。
水平分表是将一个数据量大的表按照一定的规则拆分成多个结构相同的表,将数据分散到拆分出来的表中。拆分后,当我们查找某条数据时,只需要按照拆分表时的规则推断出需要查询的数据具体存在哪一张表中,到对应的表查找数据即可。
下图是按照时间作为规则水平拆分表的示例:
常见的水平分表方案
1.按时间拆分
像上图中的拆分示例,采用的是按照年份水平拆分表的方案,除此之我们还可以通过月份、天数等规则进行拆分;在查询数据时,推断数据属于什么时间段,为其请求到相应表进行查找数据的操作
下图是按照月份作为规则水平拆分表的示例:
2.按主键id范围拆分
这种规则适合使用在主键id自增的表上,如一张有500w
数据的表user
,我们将其拆分成5
张表,每张表都各自存储100w
的数据
user1
存储id在1~100w
范围的数据user2
存储id在1+100w~200w
范围的数据user3
存储id在1+200w~300w
范围的数据user4
存储id在1+300w~400w
范围的数据user5
存储id在1+400w~500w
范围的数据
当我们需要查找一个数据时,只需要对id的范围进行一个判断并进入到对应的表进行查找操作即可(如:id=210w
的数据,id范围处在1+200w~300w
范围内,因此到user3
表中进行查找操作即可~!!)
3.Hash分表
hash分表原理与hash表存储数据的原理类似,在hash表中,为了保证数据的均匀分布,在进行存储操作前需要对数据的关键字进行取模运算。
同样的,hash分表为了将数据尽可能的均匀分布在各张表中,我们也需要对大表中的数据的关键字(一般使用主键id作为关键字)进行取模运算。在通过关键字查询数据时,我们只需要将该关键字进行一次取模运算即可得知与数据的对应的表并进行查询操作~!!
下图是按照hash水平分表的示例:
下图对主键id进行取模的运算,向2取模,运算过程:
- 1%2=1
- 2%2=0
- 3%2=1
- 4%2=0
因此,id等于1、3
的数据存储在同一张表中;同理,id等于2、4
的数据存储在同一张表中。(其实通过观察,我们可以发现,当取模运算向%2
取模时,会将id通过奇偶的不同进行水平分表)
总结
1. 什么是水平分表?
- 水平分表是将一个数据量大的表按照一定的规则拆分成多个结构相同的表,将数据分散到拆分出来的表中。拆分后,当我们查找某条数据时,只需要按照拆分表时的规则推断出需要查询的数据具体存在哪一张表中,到对应的表查找数据即可
2.水平分表的优缺点?
- 水平分割会给应用增加复杂度,它通常在查询时需要多个表名,查询所有数据需要union操作。在许多数据库应用中,这种复杂性会超过它带来的优点,因为只 要索引关键字不大,则在索引用于查询时,表中增加两到三倍数据量,查询时也就增加读一个索引层的磁盘次数。