`
cd0281
  • 浏览: 123022 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

分库分表总结(转)

 
阅读更多
单库单表
单库单表是最常见的数据库设计,例如,有一张用户(user)表放在数据库db中,所有的用户都可以在db库中的user表中查到。

单库多表
随着用户数量的增加,user表的数据量会越来越大,当数据量达到一定程度的时候对user表的查询会渐渐的变慢,从而影响整个DB的性能。如果使用mysql, 还有一个更严重的问题是,当需要添加一列的时候,mysql会锁表,期间所有的读写操作只能等待。
可以通过某种方式将user进行水平的切分,产生两个表结构完全一样的user_0000,user_0001等表,user_0000 + user_0001 + …的数据刚好是一份完整的数据。

多库多表
         随着数据量增加也许单台DB的存储空间不够,随着查询量的增加单台数据库服务器已经没办法支撑。这个时候可以再对数据库进行水平区分。

分库分表规则
         设计表的时候需要确定此表按照什么样的规则进行分库分表。例如,当有新用户时,程序得确定将此用户信息添加到哪个表中;同理,当登录的时候我们得通过用户的账号找到数据库中对应的记录,所有的这些都需要按照某一规则进行。
路由
         通过分库分表规则查找到对应的表和库的过程。如分库分表的规则是user_id mod 4的方式,当用户新注册了一个账号,账号id的123,我们可以通过id mod 4的方式确定此账号应该保存到User_0003表中。当用户123登录的时候,我们通过123 mod 4后确定记录在User_0003中。
分库分表产生的问题,及注意事项
1.   分库分表维度的问题
假如用户购买了商品,需要将交易记录保存取来,如果按照用户的纬度分表,则每个用户的交易记录都保存在同一表中,所以很快很方便的查找到某用户的购买情况,但是某商品被购买的情况则很有可能分布在多张表中,查找起来比较麻烦。反之,按照商品维度分表,可以很方便的查找到此商品的购买情况,但要查找到买人的交易记录比较麻烦。

所以常见的解决方式有:
     a.通过扫表的方式解决,此方法基本不可能,效率太低了。
     b.记录两份数据,一份按照用户纬度分表,一份按照商品维度分表。
     c.通过搜索引擎解决,但如果实时性要求很高,又得关系到实时搜索。


2.   联合查询的问题
联合查询基本不可能,因为关联的表有可能不在同一数据库中。

3.   避免跨库事务
避免在一个事务中修改db0中的表的时候同时修改db1中的表,一个是操作起来更复杂,效率也会有一定影响。

4.   尽量把同一组数据放到同一DB服务器上
例如将卖家a的商品和交易信息都放到db0中,当db1挂了的时候,卖家a相关的东西可以正常使用。也就是说避免数据库中的数据依赖另一数据库中的数据。


一主多备
在实际的应用中,绝大部分情况都是读远大于写。Mysql提供了读写分离的机制,所有的写操作都必须对应到Master,读操作可以在Master和Slave机器上进行,Slave与Master的结构完全一样,一个Master可以有多个Slave,甚至Slave下还可以挂Slave,通过此方式可以有效的提高DB集群的QPS.                                                      
所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重。
此外,可以看出Master是集群的瓶颈,当写操作过多,会严重影响到Master的稳定性,如果Master挂掉,整个集群都将不能正常工作。
所以,1. 当读压力很大的时候,可以考虑添加Slave机器的分式解决,但是当Slave机器达到一定的数量就得考虑分库了。 2. 当写压力很大的时候,就必须得进行分库操作。

         另外,可能会因为种种原因,集群中的数据库硬件配置等会不一样,某些性能高,某些性能低,这个时候可以通过程序控制每台机器读写的比重,达到负载均衡。
分享到:
评论

相关推荐

    分库分表数据看板项目实战

    总结起来,"分库分表数据看板项目实战"涵盖了数据库架构设计、分布式中间件使用、数据处理与分析、可视化展示等多个方面,是提升数据库系统性能和运维能力的宝贵实践。通过这个项目,你可以深入了解并掌握分库分表的...

    MYSQL数据库数据拆分之分库分表总结

    MySQL数据库在面对大规模数据存储时,常常需要采取数据拆分策略,即分库分表,以应对性能瓶颈和存储限制。本文将详细讲解这一过程及其相关的知识点。 首先,单库单表是最基础的数据库设计模式,但随着用户数量的...

    mybatis-mate 为 mp 企业级模块,支持分库分表,数据审计、数据敏感词过滤

    总结来说,Mybatis-Mate 是一款全面的数据库管理工具,它集成了多种高级特性,如分库分表、数据审计、敏感词过滤、字段加密、字典回写和数据权限控制,为企业级数据库应用提供了强大的保障。无论是在大数据分析、...

    php 分库分表hash算法

    总结一下,这个PHP分库分表hash算法通过`crc32`计算hash值并取模,将数据均匀地分配到各个数据库和表中。虽然简单,但在小型系统中可能适用,但对于大型分布式系统,可能需要更复杂的一致性hash策略来确保数据分布的...

    数据库+分表分库+垂直拆分与水平拆分

    1. **客户端代理**:如Sharding-JDBC,它可以在JDBC层之上提供分库分表功能,无需修改现有应用程序代码。 2. **中间件代理**:如Mycat,它作为一个独立的服务运行,通过SQL解析和路由规则将请求分发到不同的数据库...

    互联网应用系统的横向扩展架构.pptx

    总结来说,互联网应用系统的横向扩展架构是通过服务化、中间件、读写分离、分区表、分库分表等技术手段,解决快速增长的业务需求和单体应用的局限性,构建出一个高可用、可扩展的分布式系统。这样的架构能够有效地...

    讨论一下秒杀系统的技术难点与解决方案.docx

    而后端则主要依赖于数据库分库分表以及多级缓存策略,尤其是CDN、Nginx和Redis组成的多级缓存体系。通过这些技术的应用,不仅可以有效应对高并发场景下的压力,还能提升用户体验,保障系统的稳定运行。在实际应用...

    365日历使用新技术促进架构的演进

    - 另外,文章提到了云服务的使用,包括腾讯云服务的云主机、云mysql(CDB)、云负载均衡和云监控,利用云服务减轻运维压力,并优化数据库架构,采用了分库分表的策略来应对单库性能的下降和查询速度问题。 基于ELK的...

    银行架构转型及LinuxONE行业解决方案.pptx

    LinuxONE的开放性使得技能复用和应用迁移变得简单,避免了平台锁定,同时,其强大的纵向扩展能力解决了分库分表带来的困扰,使银行能够专注于业务创新。 【应对互联网金融冲击】面对互联网金融的挑战,银行需要构建...

    京东青龙系统数据库架构演进.pdf

    因此,京东开始探索新的解决方案,包括分库分表规则设计、代码重写、选择开源数据库(如MySQL)、采用DB中间件(如Jproxy),以实现更灵活的扩展性、提高系统可用性、提升技术自主性、降低成本并满足未来几年的业务...

    阿里分布式数据库服务原理与实践

    总结,阿里云的分布式数据库服务DRDS是应对大数据时代挑战的重要工具,它通过分库分表、读写分离和分布式事务等机制,为高并发、大数据量的业务提供稳定、高效的解决方案。深入学习和掌握DRDS,将有助于企业在数字化...

    MySQL高性能优化总结

    超出该范围时,可考虑数据归档或分库分表。 6. **谨慎使用分区表**:分区表虽有助于大型数据集的管理,但跨分区查询可能效率低下。物理分表可能更为高效。 7. **表设计**:避免关联操作和预留字段,前者可能导致...

    linux运维学习笔记:企业Shell面试题总结-1.pdf

    3. 脚本实现MySQL数据库分库备份和分库分表备份 这两个案例展示了如何使用Shell脚本自动化MySQL数据库的备份工作,包括分库和分表的情况。这通常涉及到数据库操作命令,如`mysqldump`,以及脚本中循环逻辑来处理多个...

    mysql进阶学习一之知识点总结(csdn)————程序.pdf

    可以通过优化SQL、建立适当的索引、分库分表以及调整my.cnf配置文件来改善性能。 - 添加索引的策略包括:常用查询条件字段、关联字段、组合索引以及用于ORDER BY和GROUP BY的字段。避免为低区分度、频繁修改或查询...

    TBase在保险行业的应用实践.pptx

    3. 在OLTP和OLAP场景下,TBase能同时提供高并发处理和大数据量分析能力,解决分库分表带来的痛点。 4. 分布式事务处理是TBase的强项,可以解决传统分库分表模式的挑战。 通过分布式改造规范,保险行业可以充分利用...

    阿里面试问题总结.pdf

    6. **分库分表**:依据业务规模和查询需求,通过水平扩展减轻单表压力。常见的工具有ShardingSphere、MyCAT等。 7. **BIO与NIO**:BIO是同步阻塞I/O,适合连接数少且固定的场景;NIO是同步非阻塞I/O,适合连接数多...

Global site tag (gtag.js) - Google Analytics