`

大数据量的存储分表常见算法

阅读更多

转自:http://hi.baidu.com/longniao/blog/item/3a19c5bf40e1141f19d81fd3.html

当一个应用的数据量大的时候,我们用单表和单库来存储会严重影响操作速度,如mysql的myisam存储,我们经过测试,200w以下的时候,mysql的访问速度都很快,但是如果超过200w以上的数据,他的访问速度会急剧下降,影响到我们webapp的访问速度,而且数据量太大的话,如果用单表存储,就会使得系统相当的不稳定,mysql服务很容易挂掉。所以当数据量超过200w的时候,建议系统工程师还是考虑分表.

 

以下是几种常见的分表算法。

 

1.按自然时间来分表/分库;

 

如一个应用的数据在一年后数据量会达到200w左右,那么我们就可以考虑用一年的数据来做为一个表或者库来存储,例如,表名为app,那么2010年的数据就是app_2010,app_2011;如果数据量在一个月就达到了200w左右,那么我们就可以用月份来分,app_2010_01,app_2010_02.

 

2.按数字类型hash分表/分库;

 

如果我们要存储用户的信息,我们应用的注册量很大,我们用单表是不能满足存储需求的,那么我们就可以用用户的编号来进行hash,常见的是用取余操作,如果我们要分30张表来存储用户的信息,那么用户编号为1的用户1%30=1,那么我们就存在user_01表里,如用户的编号为500,那么500%30=20,那么我们就将此用户的信息存储在user_20的表里.

 

3.按md5值来分表/分库;

 

我们假设要存储用户上传的文件,如果上传量大的话,也会带来系统的瓶颈问题,我们做过试验,在一个文件夹下如果超过200个文件的话,文件的浏览效率会降低,当然,这个不属于我们本文讨论的范围,这块也要做散列操作.我们可以用文件的用户名来md5或者用文件的md5校验值来做,我们就可以用md5的前5位来做hash,这样最多我们就可以得到5^5=3125个表,每次在存储文件的时候,就可以用文件名的md5值的前5位来确定这个文件该存那张表.

 

4.实例:某微博的url加密算法和存储策略的猜想.

 

现在好多微博都用这样的url来访问,如果他们的域名为www.example.com,那么如果你发微博的时候,你会发现你所发的url都变成了http://t.cn/Mx4ja1,这样的形式,他们是怎么进行这样的转换呢?我猜想就是用到了我们上面讲的md5的存储和查找规则,用你发的url来进行md5,得到md5值之后,如我们例子来说,就会用前6位来进行分表.

 

5.分表所带来的问题.

 

分表也会带来一系列的问题,如分页的实现,统计的实现,如果我们要做一个所有数据的分页,那么我们得每张表都得遍历一遍,这样访问效率会很低下.之前我尝试过用mysql的代理来实现,最终用tcsql来实现了.

 

6.分表算法的选择.

 

首先,分表适合于没有大的列表的应用来使用,要不然,会为这部分做好多额外的工作,如果你的应用数据量不是特别大的话,最好别用分表。呵呵,以前在做项目的时候,一项目经理要我们设计了一个千万级别的分表算法,而应用的pv不会超过100,总有点大炮打蚊子的感觉,而且因为分表,把整个项目的工期拖延了不少,得不偿失。

分享到:
评论

相关推荐

    超大数据量存储常用数据库分表分库算法总结

    在应对超大数据量存储时,数据库分表分库是一种有效的解决方案,它能够提高查询效率,增强系统的稳定性。本文主要介绍了三种常见的分表分库算法,并探讨了分表带来的问题及选择算法的考量因素。 首先,按照自然时间...

    数据分库分表之二叉树分库分表

    #### 三、分库分表常见方式分析 ##### 3.1 最简单的方法 - **按照时间分表**:适用于具有时间属性的历史数据。 - **简单分库分表**:通过两张表实现分库分表,如用户ID表与用户详情表。 这些方法适用于小型应用,...

    HashFNV算法的-分表代码.rar

    分表是一种数据库优化策略,通过将大量数据分散到多个子表中,来减少单个表的数据量,从而提高查询效率和系统的整体性能。 分表的基本思想是,将一个大的数据表根据一定的规则拆分成多个小的表,每个小表存储一部分...

    亿级单库分表算法设计方案.rar

    水平分表是根据某个字段的值(通常是ID)将数据行分割到不同的表中,每个表的数据量相对较小,查询时可以通过哈希等算法定位到相应的表。垂直分表则是根据字段属性,将相关性弱的字段分离到不同的表,降低单表复杂度...

    Node.js 实现的 MySQL 分表分库中间件,用于海量数据的分布式集群储存管理和高并发访问。.zip

    分表分库(Sharding)是解决大数据量和高并发问题的一种常见策略。通过将单一的大表拆分为多个小表,分散到不同的数据库服务器上,可以显著提升查询效率,降低单个节点的压力,提高系统的整体性能和可用性。在Node....

    php 分库分表hash算法

    在IT行业中,数据库扩展是解决高并发、大数据量问题的关键策略之一。分库分表是一种常见的数据库水平扩展方法,它将单一的大表分成多个小表,分散存储在不同的数据库服务器上,以提高查询效率和系统整体性能。在这个...

    数据库分库分表存储分析思路

    数据库分库分表存储分析...数据库分库分表存储是解决大数据量存储的有效方法之一,但是需要选择合适的分库或分表方法,考虑到join操作、事务、成本等问题,并选择合适的路由算法来确定某条数据具体属于哪个切分后的表。

    springmvc分库分表实际例子

    在IT行业中,数据库扩展是解决高并发、大数据量场景下的常见策略,而“分库分表”正是其中一种有效的手段。本示例“springmvc分库分表实际例子”提供了一个基于SpringMVC实现的实战项目,旨在帮助开发者了解如何在...

    从程序员到架构师:大数据量、缓存、高并发、微服务、多团队协同等核心场景实战.docx

    1. 大规模数据处理:对于需要处理大量数据的业务场景,如电商、金融等,分库分表可以提高系统的处理能力和响应速度。 2. 高并发访问:在面临高并发访问的场景中,如双 11 大促、抢购等,分库分表可以降低数据库的...

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

    示例:假设用户ID为123456789,通过MD5算法计算出一个16位的哈希值,然后对该值进行模运算(例如模1000),得出的数值可以用来决定该用户数据存储在哪一个子表中。 ``` 这样做可以有效降低单个表的负担,提高...

    sharding-proxy实现分表

    分库分表是数据库水平扩展的一种常见策略,用于解决单表数据量过大导致的性能问题。随着业务的增长,数据量可能会急剧增加,单个数据库无法高效处理,这时就需要将数据分散到多个数据库或表中,以降低单表的数据量,...

    转:Mybatis分库分表扩展插件

    Mybatis 分库分表扩展插件是一个用于解决大型系统中数据量过大,导致单个数据库性能瓶颈的问题。这种插件通常包含一系列策略和算法,帮助开发者将数据分散到多个数据库或表中,以实现水平扩展,提高系统的处理能力。...

    基于mybatis插件实现轻量级分库分表方案-亿级数据mysql存储解决方案-mybatis-sharding.zip

    在应对大数据量的存储与查询问题时,分库分表是一种常见的优化策略。MyBatis-Sharding 是一种基于 MyBatis 的轻量级分库分表解决方案,它可以帮助开发者有效地解决亿级数据量下的 MySQL 存储问题。下面将详细介绍 ...

    groovy代码-分库分表算法

    在IT行业中,数据库分库分表是一种常见的解决大数据量存储和查询性能问题的策略。它将一个大型数据库拆分成多个小型数据库,每个数据库处理一部分数据,以提高数据处理效率和系统的可扩展性。Groovy是一种基于Java...

    MySQL 分库分表的实现原理及演示案例.zip

    MySQL数据库在面临大数据量时,性能可能会显著下降,此时就需要采用分库分表的技术来解决这一问题。分库分表是数据库水平扩展的一种常见策略,它通过将数据分散到多个数据库或表中,来减轻单个数据库的压力,提高...

    47_来来来!咱们聊一下你们公司是怎么玩儿分库分表的?.zip

    分库分表是一种常见的数据库垂直切分和水平切分方法,其目标是解决单个数据库因数据量过大或访问压力过高而导致的性能瓶颈问题。垂直切分是根据业务功能将表拆分成不同的数据库,而水平切分则是按照一定的规则(如...

    mycat对mysql数据库进行分库分表demo-mycat-demo-parent.zip

    分库分表是解决大数据量时性能瓶颈的一种常见策略,它可以将大量数据分散到多个数据库或表中,以减轻单个数据库的压力,提高查询效率。 【MyCat核心知识点】 1. **MyCat架构**:MyCat作为数据库中间件,其核心功能...

    shardingsphere-jdbc实现简单的单库分表

    **正文** ShardingSphere-JDBC 是一款开源的数据库中间件,它主要提供了数据分片、读写分离以及数据库...通过其灵活的配置和API,我们可以快速地在Spring Boot环境中实现单库分表,以应对大规模数据存储和处理的挑战。

    分库分表技术分享-lzg

    - 大数据量存储:当数据量达到一定程度,单表的数据存储和检索性能会显著下降。 - 数据隔离:不同业务模块的数据独立管理,避免数据冲突和权限问题。 - 横向扩展:通过增加服务器数量来提升系统整体性能,而非...

Global site tag (gtag.js) - Google Analytics