当一个应用的数据量大的时候,我们用单表和单库来存储会严重影响操作速度,如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,总有点大炮打蚊子的感觉,而且因为分表,把整个项目的工期拖 延了不少,得不偿失。
原文:http://www.360doc.com/content/11/0628/11/597197_130081429.shtml
相关推荐
比较完善的大量数据分表功能代码,包含创建数据库、生成数据、测试结果。适合初学分表者使用。 数据按照每个月创建一个数据表,通过存储过程输入参数,按照指定日期跨表查询数据,并且可以分页查询。
主要介绍了超大数据量存储常用数据库分表分库算法总结,本文讲解了按自然时间来分表/分库、按数字类型hash分表/分库、按md5值来分表/分库三种方法,以及分表所带来的问题探讨,需要的朋友可以参考下
水平拆分数据分库和分表的核心问题是表的ID唯一,然后根据唯一的ID映射到一个物理存储位置,这个映射方案要考虑到满足数据量暴增线性扩展和业务上容易保持一致,本文主要讨论分库分表如何映射的问题。
① 创建数据库 ② 在创建的数据库中添加文件组 ③ 在文件组中添加新的文件 ④ 定义分区函数 ⑤ 定义分区架构 ⑥ 定义分区表 ⑦ 定义代理作业,自动添加分区分割点 ⑧ 测试数据
分享一个分库分表hash算法,需要的朋友可以参考下。
kettle对数据分表插入 数据库Oracle etl工具 kettle 通过java脚本,hash算法,实现分表数据写入
- 产品上线以后,数据量越来越大,当一个表有几十万上百万条记录的时候,是时候考虑分表了。【超过几千万记录的话,这个分表估计不适合。】 - 怎么做 - 分表情况,1:hash分表,按照目标表的id的hash值,写入对应...
16张表的Hash分表实现,通过计算得到应该存入哪张表,查询的时候再次计算得到去哪张表取数据。这是简单的思路,通过Hash算法,保证数据平均分布在这16张表上,实现减少查询扫表的数量。
解决大数据量存储时,分表存储时常见问题及解决方案
1、修改表名 2、创建新表 3、按时间条件插入数据 由于数据太大、用的改表名的方式备份分表,通过传入表名和条件字段名备份相应的表
随着信息技术的快速发展,数据量越来越大,海量的表查询操作需要消耗大量的时间,成为影响数据 库访问性能提高的主要因素。为了提升数据库操作的查询效率和用户体验,在关系型数据库管理系统 ( MySQL) 中通过 range ...
分表 JAVA 分表例子,带SQL文件 很简单的例子,就可以明白怎么分表。
MySQL分表及分表后插入sql语句,表为订单表,可以参考一下
一个简单的oracle数据库环境下的存储过程,介绍了如何从带年月人的分表取数据
SQL,大数据分表,SQL千万级分表,删除百万数据
数据库分库分表 数据库分库分表 数据库分库分表
sharding-jdbc 分库分表 CRUD
mysql自带的原始分表,根据省份分表,直接导入既可使用
php分库分表