MySQL水平分表原理讲解

水平分表是应对大数据量表的一种有效策略,包括按时间、主键ID范围和Hash取模等方式。这种方法能提高查询效率,但会增加应用复杂性,可能需要联合查询或额外的路由逻辑。在选择分表策略时,需权衡其带来的优势与增加的复杂性。
摘要由CSDN通过智能技术生成

什么是水平分表?

当一张表到达一定的数据量后(如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操作。在许多数据库应用中,这种复杂性会超过它带来的优点,因为只 要索引关键字不大,则在索引用于查询时,表中增加两到三倍数据量,查询时也就增加读一个索引层的磁盘次数。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云丶言

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值