`
bugyun
  • 浏览: 559329 次
社区版块
存档分类
最新评论

数据库切分“基本思想”、“常见问题”

 
阅读更多

优点:

分库降低了单点机器的负载;

分表提高了数据操作的效率,尤其是write操作的效率

 

1.垂直切分

适用场景:表多数据多。

特点:规则简单、业务逻辑清晰、业务耦合度非常低。根据相同业务使用的表放到相同的数据库。在垂直切分出的表聚集内,找出“根元素”,按“根元素”进行水平切分,也就是从“根元素”开始,把所有和它直接与间接关联的数据放入一个shard(碎片)里,如对于社交网站,几乎所有数据最终都会关联到某个用户上,基于用户进行切分就是最好的选择。再比如论坛系统,用户和论坛两个模块应该在垂直切分时被分在了两个shard里,对于论坛模块来说,Forum(论坛)显然是聚合根,因此按Forum进行水平切分,把Forum里所有的帖子和回帖都随Forum放在一个shard里是很自然的。

 

 

2.水平切分

适用场景:表少数据多。

特点:拆分规则复杂、后期维护复杂,针对数量大的表拆分串联,同一个表中的不同数据拆分到不同的数据库中。

切分优点:索引开销降低,减少单表写操作锁表时间。

如article表中现在有5000w条数据,此时我们需要在这个表中增加(insert)一条新的数据,insert完毕后,其他数据库 会针对这张表重新建立索引,5000w行数据建立索引的系统开发开销还是不容忽视的。但是反过来,假如我们将这个表分成100个table呢,从article_001一直到article_100,5000w行数据平均下来,每个子表里边就只有50万行数据,这时候我们向一张只有50w行数据的table中insert数据后建立索引的时间就会呈数量级的下降,极大了提高了db的运行时效率,提高了db的并发量。

切分规则:

a.按号段分

eg:id为区分,1~1000的对应db1,1001~2000的对应db2,2001~2100的对应db3,以此类推

id为区分,1~1000的对应db1,1001~2000的对应db2,以此类推

优点:可部分迁移

缺点:数据分布不均

 

b.hash取模分

对id进行hash(或者如果id是数值型的话直接使用id的值也可),然后用一个特定的数字,比如应用开发中需要将一个其他数据库 切分成4个其他数据库 的话,我们就用4这个数字对id的hash值进行取模运算,也就是id%4,这样的话每次运算就有四种可能:结果为1的时候对应db1;结果为2的时候对应db2;结果为3的时候对应db3;结果为0的时候对应db4,这样一来就非常均匀的将数据分配到4个db中。

优点:数据分布均匀

缺点:数据迁移的时候麻烦,不能按照机器性能分摊数据

 

c.在认证库中保存其他数据库配置

就是建立一个db,这个db单独保存user_id到db的映射关系,每次访问其他数据库 的时候都要先查询一次这个其他数据库 ,以得到具体的db信息,然后才能进行我们需要的查询操作。

优点:灵活性强,一对一关系

缺点:每次查询之前都要多一次查询,性能大打折扣

 

通常系统水平切分和垂直切分联合使用,系统做垂直切分,个别大表水平切分,即先垂直切后水平切。

 

3.切分的常见问题和应对策略

a.事务问题:

解决事务问题目前有两种可行的方案:分布式事务和通过应用程序与数据库共同控制实现事务下面对两套方案进行一个简单的对比。

方案一:使用分布式事务

   优点:交由数据库管理,简单有效

   缺点:性能代价高,特别是shard越来越多时

方案二:由应用程序和数据库共同控制

    原理:将一个跨多个数据库的分布式事务分拆成多个仅处

          于单个数据库上面的小事务,并通过应用程序来总控

          各个小事务。

    优点:性能上有优势

    缺点:需要应用程序在事务控制上做灵活设计。如果使用   

          了spring的事务管理,改动起来会面临一定的困难。

b.跨节点Join的问题

   只要是时行切分,跨节点Join的问明是不可避免的。但是良好的设计和切分却可以减少此类情况的发生。解决这一问题的普遍做法是分两次查询实现。在第一次查询的结果集中找出关联数据的id,根据这些id发起第二次请求得到关联数据。

c.跨节点的count,order by,group by以及聚合函数问题

   这些是一类问题,因为它们都需要基于全部数据集合进行计算。多数的代理都不会自动处理合并工作。解决方案:与解决跨节点join问题的类似,分别在各个节点上得到结果后在应用程序端进行合并。和join不同的是每个结点的查询可以并行执行,因此很多时候它的速度要比单一大表快很多。但如果结果集很大,对应用程序内存的消耗是一个问题。

 

分享到:
评论

相关推荐

    数据库水平切分的实现原理解析

    数据切分的基本思想是根据一定的业务规则或键值范围将数据分配到不同的分片上。例如,在博客应用中,日志文章(article)表可能包含user_id字段,我们可以根据user_id将数据分片。比如,user_id在1-10000的文章存储...

    单KEY业务,数据库水平切分架构实践

    水平切分的基本思想是将数据根据一定的规则分配到不同的数据库实例中。常见的水平切分算法有两种: 1. **范围法**:这是一种较为直观的切分方法,根据主键(例如`uid`)的值将其映射到特定的数据库实例上。例如,...

    数据库水平切分方法

    水平切分的基本思想是将数据分散到多个具有相同结构的表中,以此来分摊存储和查询压力。 在实际应用中,水平切分有两种常见方法: 1. **使用MD5哈希** 这种方法是通过对用户ID(UID)进行MD5加密,然后取哈希值的...

    数据库分库分表(sharding)的技术

    **数据库分库分表(Sharding)**是一种常见的数据库优化技术,主要用于解决大规模数据存储和高并发访问带来的性能瓶颈问题。它通过将单一数据库中的数据分散到多个数据库或表中,从而提高系统的整体性能和可扩展性。...

    数据库Sharding

    其核心思想在于将单一数据库的数据分割并分布到多个数据库(服务器)上,以此来提高数据处理能力和响应速度,降低单点故障风险。Sharding主要适用于处理海量数据和高并发访问场景,尤其是在互联网、大数据等领域的...

    mysql主从分布式sharding 切分表远离.docx

    数据切分(Sharding)的核心思想是将一个大表的数据分布到多个数据库或表中,每个部分称为一个“分片”(Shard)。这种水平扩展的方式可以显著提升数据库的处理能力,因为它将单个数据库的I/O压力分散到多个节点。...

    中文数据库自然语言接口(NLIDB)技术调研.ppt

    RChiQL系统的词法分析采用了基于数据库ER语义的全匹配算法,以解决词汇歧义问题。而语法分析则通过定义特定的文法规则来解析自然语言句子,转化为对应的数据库查询语句。 在实现过程中,词法分析通常涉及长词优先的...

    快速排序算法基本思想、图解和代码示例

    快速排序是一种基于分治策略的高效排序算法,由C.A.R. Hoare在1960年提出。它的工作原理可以分为三个...同时,通过优化,例如随机化选择基准元素、三向切分等方法,可以进一步提高其性能,降低最坏情况发生的可能性。

    mysql海量数据的存储和访问解决方案汇编.pdf

    Sharding不是数据库的内置特性,而是一种抽象的软件设计思想,适用于各种数据库系统,实现水平扩展,以突破单节点数据库的性能限制。 在实际应用中,Sharding规则的制定至关重要。例如,对于一个博客应用,可以根据...

    Mycat权威指南第一版_V1.5.1

    在数据库架构设计中,分库分表是应对高并发和数据量增长的常见策略。Mycat可以实现数据库的水平切分和垂直切分,从而把数据分散存储在不同的数据库服务器上,减轻单个数据库的压力,并提高整个系统的性能。 Mycat...

    mysql读写分离,分库分表-MysqlSample.zip

    其核心思想是将一个大表分成多个小表,分别存储在不同的数据库服务器上。 1. 水平分库:根据业务逻辑或用户群体,将数据分配到多个不同的数据库中,例如按照地域或部门进行划分。 2. 水平分表(Sharding):将一个...

    找第K小问题C语言-分治法

    在计算机科学领域,找第K小问题是一种常见的算法问题,其目标是从一组整数中找到第K个最小的元素。这种问题在数据结构和算法分析中占有重要地位,因为它经常出现在排序算法的优化和在线查询系统的设计中。本文将详细...

    Java思维导图xmind文件+导出图片

    基于Mycat实战之数据库切分策略剖析 Mycat全局表、Er表、分片预警分析 Nginx 基于OpenResty部署应用层Nginx以及Nginx+lua实战 Nginx反向代理服务器及负载均衡服务器配置实战 利用keepalived+Nginx实战Nginx高...

    对分库分表的一些想法

    分库分表是一种常见的数据库水平扩展技术,其核心思想是将一个大表的数据分散到多个数据库或多个表中,以减轻单一数据库的压力,提升数据处理速度。 1. 分库:当单个数据库的负载过高时,可以通过将数据按照某种...

    分布式ID生成

    - 数据库水平切分,使得每个主库负责生成不同范围内的ID,以此来提高并发处理能力。 尽管这些改进措施能够在一定程度上解决问题,但仍存在ID生成“绝对递增性”的丧失和数据库写压力大的问题。 ##### 方法二:单点...

    大型网站系统架构演化之路.pdf

    读写分离将数据库分为读库和写库,而分库分表则分为水平切分和垂直切分。 7. CDN和反向代理的使用:针对不同地区用户的访问延迟问题,通过CDN将数据缓存到最近的运营商机房,减少网络访问路径。反向代理则可以缓存...

    车辆监控系统中时空数据模型设计与实现.pdf

    - **改进方案**:本文提出了一种通过切分时空立方体,形成单元时空立方体,并建立轨迹版本的建模思想。这种改进后的模型能够在减少存储空间的同时,显著提高时空查询的性能。 - **实现细节**:通过具体的算法实现,...

    mysql数据库应付大流量网站的的3种架构扩展方式介绍

    读写分离的基本思想是将读操作和写操作分开,通常设置一个主数据库负责写操作,多个从库负责读操作。主库的数据实时同步到从库,这样可以将大量的读请求分散到多个从库上,减轻主库的压力。但是,这种方法需要注意的...

    清华 殷人昆C++数据结构答案

    - B树和B+树:用于大量数据的高效查找,常见于数据库系统。 8. **第八章:动态规划** - 动态规划的基本思想:状态转移方程和最优子结构。 - 背包问题、最长公共子序列、最短路径等问题的动态规划解法。 9. **第...

Global site tag (gtag.js) - Google Analytics