当前位置: 首页 > 科技观察

MySQL是如何进行数据分表的,从而实现分表分库的?

时间:2023-03-12 22:55:08 科技观察

数据库分发的核心内容无非就是数据分片(Sharding)以及分片后数据的定位与整合。数据切分是将数据分散存储在多个数据库中,从而减少单个数据库的数据量,通过扩展主机数量来缓解单个数据库的性能问题,从而达到目的提高数据库的运行性能。数据切分按其切分类型可分为垂直(纵向)切分和水平(横向)切分两种方式。1.Vertical(垂直)sharding常见的verticalsharding有两种:verticalsharding和verticalsharding。1.1垂直分库是将关联度低的不同表按照业务耦合存放在不同的数据库中。其做法类似于将一个大系统拆分成多个小系统,按业务分类独立划分。类似于“微服务治理”的方式,每个微服务使用一个单独的数据库。如图:将不同模块的数据表分别存放在不同的数据库中。模块之间没有关联1.2垂直表划分是基于数据库中的“列”。如果表的字段较多,可以创建扩展表,将不常用或字段长度较大的字段拆分到扩展表中。桌子。在字段多的情况下(比如大表有100多个字段),通过“大表拆小表”更容易开发和维护,也能避免跨页问题。MySQL底层是通过数据页来存储的。占用过多空间的记录会导致跨页,造成额外的性能开销。另外,数据库以行为单位加载数据到内存中,这样表中的字段长度越短,访问频率越高,内存可以加载更多的数据,命中率更高,磁盘IO减少,从而提高数据库性能。解决业务系统层面的耦合。清晰的业务类似于微服务的治理。还可以对不同的业务数据进行分级管理、维护、监控和扩展。在高并发场景下,垂直切分可以在一定程度上增加IO和数据库连接数。1.单机硬件资源瓶颈劣势:部分表无法join,只能通过接口聚合解决,增加了开发的复杂度。分布式事务处理复杂,仍然存在单表数据量过大的问题(需要水平切分)2.Horizo??ntal(水平)分片当应用难以细粒度垂直分片时,或者数据行量大后sharding很大,存在单库读写和存储性能瓶颈,需要水平sharding。水平切分分为数据库分表和分库分表。根据表中数据的内在逻辑关系,将同一张表根据不同的条件分布到多个数据库或多个表中。每个表只包含部分数据,这样单个表的数据量就变小了,达到了分布式的效果。如图:与垂直拆分这种对表进行分类的方法相比,这种方法是将数据按照表中每个字段的一定规则存储在不同的数据库(或不同的表)中,即根据拆分数据的数据行。横向切分的优点:不存在单库数据量过大、高并发的性能瓶颈,提高系统稳定性和负载能力应用端改造小,无需拆分业务模块。缺点:跨分片事务一致性难保证跨库join关联查询性能差。多次数据扩容困难,维护量大。横向切分后,同一张表会出现在多个数据库/表中,每个数据库/表的内容都不一样。几种典型的数据分片规则是:2.1按时间间隔或ID间隔按取值范围切分。例如:将不同月份甚至不同日期的数据按照日期分散到不同的库中;userId为1~9999的记录分配给第一个图书馆,userId为10000~20000的记录分配给第二个图书馆,依此类推。从某种意义上说,一些系统采用的“冷热数据分离”,将一些使用较少的历史数据迁移到其他库中,只提供业务功能的热数据查询,也是一种类似的做法。这样做的好处是:单表大小可控,横向扩展自然方便。如果以后要扩展整个shard集群,只需要增加节点,不需要从其他shard迁移数据。在使用分片字段进行范围搜索时,连续分片可以快速定位分片进行快速查询,有效避免跨分片查询的问题。缺点:热数据成为性能瓶颈。连续分片可能会出现数据热点,比如按时间字段分片。有些分片存储的是最近一段时间的数据,可能会被频繁读写,而有些分片存储的是很少被查询到的历史数据。2.2根据Numerical取模一般采用hash取模的切分方式,例如:将Customer表根据cusno字段分4个库,0的余数放入第一个库,1的余数放入第二个库,等等。这样,同一个用户的数据就会分散在同一个库中。如果查询条件有cusno字段,可以明确定位到对应的库中进行查询。优点:数据分片比较均匀,不易出现热点和并发访问瓶颈。缺点:后期分片集群扩容时,需要迁移旧数据(使用一致性哈希算法可以更好的避免这个问题),容易面临跨分片查询的复杂问题。比如上面的例子,如果经常使用的查询条件不包含cusno,则无法定位到数据库,所以需要同时向四个数据库发起查询,然后合并内存中的数据,取最小的集合并将其返回给应用程序。图书馆反而变成了累赘