首页 > 其他分享 >分库分表

分库分表

时间:2024-08-20 19:49:20浏览次数:4  
标签:分库 数据库 划分 数据量 分表 数据

一、数据库性能影响因素

  • 数据量

MySQL单库数据量在5000万以内性能比较好,超过阈值后性能会随着数据量的增大而变弱。MySQL单表的数据量是500w-1000w之间性能比较好,超过1000w性能也会下降(因为表数据为1000万时建立的索引如果是B+Tree类型的话一般树高在3~5之间,所以查询的速度自然也是很快速的)。

  • 磁盘、CPU、内存等机器性能

因为单个服务的磁盘空间是有限制的,如果并发压力下,所有的请求都访问同一个节点,肯定会对磁盘IO造成非常大的影响。

  • 数据库连接

数据库连接是非常稀少的资源,如果一个库里既有用户、商品、订单相关的数据,当海量用户同时操作时,数据库连接就很可能成为瓶颈(在高并发情况下,大量请求落入数据库,最终会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值)。 

二、分库分表

综述:垂直拆分更偏向于业务拆分的过程,在技术上我们更倾向于水平切分的方案;

2.1 分表

按照规则把一张表划分成多张表,使用时时根据规则找到对应数据,然后操作它。

  • 分表原因:单表数据量过大时,查询会很慢。(索引会很大,开销大;频繁读写,加锁操作密集)
  • 多张表还是在一台机器上。

2.1.1 水平分表——按行进行划分,横着切成多个表。

  • 方案1:按范围切分方式。可以根据某个字段的范围做划分,比如订单号字段,从0到10000一个表,10001到20000一个表。
    • 优点:扩容比较方便,因为如果ID范围不够了,只需要调整规则,然后建好新表即可。  
    • 缺点:无法解决热点问题,如果某一段数据访问QPS特别高,就会落到单表上进行操作。 
  • 方案2:HASH取模。可以根据某个字段的HASH取模做划分,建议是 2^n,这样可以方便在扩容的时尽可能的少迁移数据。比如将一个用户表分成8个子表,可以取用户id,然后hash后取8的模,从而分配到不同的数据库上。
    • 优点:数据散列均衡,每个表的数据量大致相同;请求压力散列均衡,不存在访问热点。
    • 缺点:扩容不方便,需要数据迁移。这种划分一旦确定后,就无法改变子表数量了。
  • 方案3:根据业务(地理/国籍/类型等)划分。比如按照华东,华南,华北这样来区分业务表,或者安卓用户,IOS用户等来区分用户表。
  • 方案4:按照时间切分,比如将6个月前,甚至一年前的数据切出去放到另外的一张表,因为随着时间流逝,这些表的数据被查询的概率变小,所以没必要和“热数据”放在一起,这个也是“冷热数据分离”。

2.1.2 垂直分表——按列进行划分,将不常用的属性列拆分出来。

  • 方案1:按活跃度划分。将“不常用”或者“数据量大”的字段拆分到“扩展表”上。这样避免查询时,数据量太大造成的“跨页”问题。

2.2 分库

将一个库分成多个库,并部署在多个服务器上。

  • 分库原因:单机的机器性能(磁盘IO瓶颈)有限,分库可以减小单机的压力、突破性能瓶颈。
2.2.1 水平分库
  • 将单个库中的表作水平分表,然后将子表分别置于不同的子库当中,独立部署。

  • 因为库中内容的主要载体是表,所以水平分库和水平分表基本上如影随形。

2.2.2 垂直分库
  • 以表为依据,按照业务归属不同,将不同的表拆分到不同的库中。

2.3 具体分库分表

首先考虑:数据量、并发量。

  • 数据量大,就分表;
  • 并发高,就分库。

一般情况下,我们的方案都需要同时做分库分表,这时候分多少个库,多少张表,分别用预估的并发量和数据量来计算就可以了。

 

参考资料

https://zhuanlan.zhihu.com/p/342814592

标签:分库,数据库,划分,数据量,分表,数据
From: https://www.cnblogs.com/zhegemaw/p/18370195

相关文章

  • shardingsphere5分表demo
    分表配置demodatabaseName:mydb#逻辑数据库名称dataSources:ds_0:url:jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useSSL=falseusername:rootpassword:rootconnectionTimeoutMilliseconds:30000idleTimeoutMil......
  • 后台开发必问题:分库分表面试题及参考答案(3万字长文)
    目录简述为什么要分库?简述为什么要分表?解释什么时候考虑分库分表?简述什么是数据库垂直切分?简述什么是数据库水平切分?请简述数据库分库分表的概念及其优缺点。数据库垂直分表和水平分表的主要区别是什么?什么是数据库分片?它有哪些常见的实现方式?如何分库分表?分库分表......
  • mysql如何储存大量数据,分库存分表的建议和看法
    MySQL在处理大量数据时,分库分表是常见的策略,可以有效提升数据库的性能和扩展性。下面是关于MySQL分库分表的建议和看法:1.何时考虑分库分表数据量大:当单一数据库实例无法处理大规模数据或达到性能瓶颈时,可以考虑分库分表来分散数据存储和查询压力。垂直切分:将不同的......
  • 数据库读写分离和分库分表
    读写分离读写分离主要是为了将对数据库的读写操作分散到不同的数据库节点上。一般情况下,我们都会选择一主多从,也就是一台主数据库负责写,其他的从数据库负责读。主库和从库之间会进行数据同步,以保证从库中数据的准确性。这样的架构实现起来比较简单,并且也符合系统的写少读多......
  • ShardingSphere实战(3)- 快速实现分库分表
    上篇博客,我们讲了ShardingSphere实战(2)-水平分表,这篇博客,我们继续实现分库以及解决前面遗留的问题。一、绑定表基于上篇博客配置的前提下(上篇博客的最后放上了完整的配置,需要的可以去看看,这里就不重复写上去了),加上绑定表的配置:#绑定表关系spring.shardingsphere.shar......
  • 使用Redisson和分库分表技术实现海量请求注册功能
    文章目录1.海量注册的常见问题和解决方案概述2.布隆过滤器判断用户唯一性3.通过分布式锁和快速失败策略对同一时间的某一个账号进行锁定4.数据库唯一索引兜底5.通过水平分库水平分表配置分片规则6.通过自定义线程池和异步初始化配置线程池操作异步化1.海量......
  • 数据库系列: 主流分库分表中间件介绍(图文总结)
    相关文章数据库系列:MySQL慢查询分析和性能优化数据库系列:MySQL索引优化总结(综合版)数据库系列:高并发下的数据字段变更数据库系列:覆盖索引和规避回表数据库系列:数据库高可用及无损扩容数据库系列:使用高区分度索引列提升性能数据库系列:前缀索引和索引长度的取舍数据库系列:My......
  • 深入理解MyCAT分库分表机制:架构师的秘密武器
    一、MyCAT分库和分表的概念1.分库(DatabaseSharding)分库是将一个大数据库拆分成多个小数据库,以减小单个数据库的压力并提高系统的扩展性。每个子数据库可以分布在不同的服务器上,从而分散负载并提高性能。示例:假设我们有一个用户信息数据库users_db,其中包含了大量的用......
  • 面试官:聊聊你对分库分表的理解?
    在MySQL集群架构中有两种主流的集群实现,一种是读写分离,而另外一种则是数据分片。所谓的数据分片其实就是今天要聊的分库分表技术。分库分表技术不但是日常工作中用于解决数据库中的数据量会急剧增长,解决单库单表性能瓶颈的一种方案,更是面试中的高频知识点。在阿里巴巴的《Java......
  • [Mysql]分库分表
    分库分表读写分离主要应对的是数据库读并发,没有解决数据库存储问题。试想一下:如果MySQL一张表的数据量过大怎么办?换言之,我们该如何解决MySQL的存储压力呢?答案之一就是分库分表。什么是分库?分库就是将数据库中的数据分散到不同的数据库上,可以垂直分库,也可以水平分库。......