`

分库分表总结

阅读更多
转自http://happyenjoylife.iteye.com/blog/1042538
单库单表

单库单表是最常见的数据库设计,例如,有一张用户(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的分库分表技术是应对大数据量和高并发场景的重要手段,它通过合理的设计和策略,能够有效地提升系统的扩展性和性能,但同时也带来了数据一致性和运维复杂性的挑战。实践中需要根据业务特性选择合适的分...

    MySQL分库分表总结讲解

    MySQL分库分表是一种数据库优化策略,用于应对大数据量带来的性能瓶颈。随着业务的发展,单个数据库中的数据量会逐渐增大,导致查询速度下降,甚至影响到应用的正常运行。此时,通过分库分表,将单一的数据库或表...

    分库分表 各种mysql中间件 总结(csdn)————程序.pdf

    本篇文章将对各种MySQL中间件进行总结,重点关注如何使用ShardingSphere进行分库分表以及相关的配置。首先,我们需要引入必要的依赖库,包括MySQL的JDBC驱动、ShardingSphere的Spring Boot Starter、阿里巴巴的Druid...

    数据库分库分表的技术演进与最佳实践.docx

    数据库分库分表的技术演进与最佳实践 在移动互联网时代,海量数据的产生对数据库的存储和查询提出了很大的挑战。面对如此庞大的数据量,单一的数据库表已经无法满足需求,而数据库分库分表技术则是解决这个问题的...

    分库分表_基于当当jdbc-sharding

    总结起来,基于当当jdbc-sharding的分库分表技术,通过配置文件(如`jdbc.properties`和`applicationContext.xml`)设定数据库连接和分片规则,利用`sql.txt`脚本处理数据操作,结合`config`和`algorithm`中的配置与...

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

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

    CDR分库分表的机制

    ### CDR分库分表机制详解 #### 一、引言 随着通信行业业务量的不断增长,单一数据库已经难以满足大规模数据处理的需求。CDR(Calling Detail Record,呼叫详细记录)作为通信业务中的一项重要数据,其处理能力直接...

    sharding-jdbc分库分表

    总结,Sharding-JDBC作为一个优秀的数据库中间件,通过分库分表和读写分离技术,为Java开发者提供了强大的数据库扩展能力。通过深入学习和实践"shanjupay"项目,我们可以更好地理解和运用这一技术,以应对日益增长的...

    MyBatis实现Mysql数据库分库分表操作和总结(推荐)

    MyBatis实现Mysql数据库分库分表操作和总结 MyBatis是一款流行的持久层框架,能够与Mysql数据库进行交互。在大规模的应用系统中,数据库的性能和可扩展性变得非常重要。为了解决这个问题,需要实现数据库的分库分表...

    分库分表中文手册-shardingsphere.pdf

    总结来说,ShardingSphere 是一套功能全面的分布式数据库解决方案,它能够帮助开发人员和系统架构师在分库分表、事务管理、数据治理、读写分离、弹性伸缩等多方面提升系统性能,保证数据的一致性和安全性,并且提供...

    分库分表代码实现和讲解

    总结来说,通过PHP实现MySQL的分库分表涉及数据路由策略、数据库连接管理、SQL改造、事务处理等多个方面。理解并掌握这些要点,有助于在应对大数据挑战时构建高效、可扩展的数据库系统。而"fenkufenbiao"这个文件名...

    mysql大数据分库和分表 php解决方案

    在这种背景下,单一数据库往往难以承受巨大的数据处理压力,因此,采用分库分表技术成为了提高数据库性能的有效手段之一。本文主要探讨MySQL大数据分库和分表的PHP解决方案,并通过具体的案例分析来加深理解。 ####...

    MySQL分库分表.doc

    总结来说,MYCAT作为一款强大的数据库中间件,通过分库分表解决了大数据量场景下的性能和扩展性问题,同时提供了高可用性和兼容性,使得企业能够以较低的成本构建高性能的数据库集群。其灵活的分片策略和易于部署的...

    ShardingJDBC5.1.1按月分库分表、读写分离、自动创表完整demo

    《使用ShardingJDBC5.1.1实现按月分库分表、读写分离与自动创表的全面实战》 在现代企业级应用中,数据量的快速增长使得数据库的性能优化成为至关重要的环节。ShardingJDBC作为一款轻量级的Java框架,能够有效地...

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

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

    【Mycat操作之分库分表入门】

    【Mycat操作之分库分表入门】 Mycat是一款开源的分布式数据库中间件,主要功能是实现数据库的水平扩展,通过分库分表来处理大数据量的问题,减轻单机数据库的压力。它支持MySQL协议,可以透明地将一个数据库集群...

    分库分表入门级-lzg

    总结来说,分库分表是应对大数据时代的关键技术,通过合理的设计和策略选择,可以有效地提升数据库性能,支撑大规模业务系统的稳定运行。在实践中,需要根据业务特点、数据增长趋势和系统扩展性需求,综合考虑各种...

    incubator-shardingsphere-example-dev_currenthfw_分库分表_源码

    《Apache Incubator ShardingSphere 分库分表实践详解》 Apache Incubator ShardingSphere 是一个开源的数据库中间件,旨在提供分布式数据库解决方案,包括数据分片、数据库读写分离以及数据加密等功能。在本示例...

Global site tag (gtag.js) - Google Analytics