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

本文探讨了在数据量超过200万时,采用分表策略提高数据库操作效率的方法。介绍了按时间、数字类型hash及MD5值分表的具体实施方式,并分析了分表带来的挑战及其适用场景。

当一个应用的数据量大的时候,我们用单表和单库来存储会严重影响操作速度,如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

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

 

 

 

在处理 MySQL 大数据量时,分表策略是提升系统性能和可扩展性的关键手段之一。常见分表方法包括水平分表和垂直分表,每种方法适用于不同的业务场景和数据访问模式。 ### 水平分表 水平分表是指将一张表的数据按照某种规则拆分到多个物理表中,每个表的结构相同,但存储不同的数据子集。常见的拆分策略包括: - **按时间分表**:适用于时间序列数据,例如日志、订单等。可以按照年、月、日等时间单位进行拆分。 - **按哈希分表**:通过哈希算法将数据均匀分布到多个表中。这种方式可以保证数据分布的均衡性,但可能不利于范围查询。 - **按范围分表**:将数据按照某个字段的范围(如ID、时间等)进行划分。这种方式适合范围查询,但可能导致数据分布不均。 - **按列表分表**:根据某个字段的特定值列表进行分表,适用于离散值较多的字段,例如地区、状态等。 水平分表的优势在于可以有效减少单表的数据量,从而提升查询性能和维护效率。然而,它也会增加系统的复杂性,特别是在处理跨表查询、事务和数据一致性时需要额外的机制支持。 ### 垂直分表 垂直分表是指将一张表的列拆分到多个表中,通常将高频访问的字段和低频访问的字段分开存储。例如,将用户的基本信息(如ID、姓名、手机号)和扩展信息(如详细地址、备注等)分别存储在两个表中。 垂直分表的优点是可以减少单表的数据宽度,提升查询效率,尤其是在只需要访问部分字段时。此外,它还可以减少锁竞争,提高并发性能。然而,垂直分表可能导致表之间的关联查询增加,从而增加系统的复杂性。 ### 分库分表 在数据量进一步增长的情况下,仅靠分表可能无法满足性能需求,此时需要结合分库策略。分库分表是将数据分散到多个数据库实例中,每个数据库实例包含多个分表。这种策略可以进一步提升系统的并发处理能力和负载能力。 实现分库分表时,需要考虑以下几个关键问题: - **中间件选择**:可以使用如 MyCat、ShardingSphere 等开源中间件来管理分库分表逻辑。 - **路由规则配置**:需要定义清晰的规则来决定数据如何分布到不同的库和表中。 - **跨库跨表查询**:需要设计合理的查询策略来处理分布式查询。 - **数据一致性**:确保在分布式环境中数据的一致性和事务的完整性。 ### 示例代码 以下是一个简单的水平分表示例,假设需要将订单数据按时间分表: ```sql -- 创建订单表的分表 CREATE TABLE orders_2023 ( id INT PRIMARY KEY, user_id INT, order_date DATE ); CREATE TABLE orders_2024 ( id INT PRIMARY KEY, user_id INT, order_date DATE ); -- 插入数据到对应的分表 INSERT INTO orders_2023 (id, user_id, order_date) VALUES (1, 101, '2023-05-01'); INSERT INTO orders_2024 (id, user_id, order_date) VALUES (2, 102, '2024-03-15'); ``` 上述代码展示了如何按时间将订单数据拆分到不同的表中。实际应用中,还需要结合业务逻辑和查询需求设计更复杂的分表策略。 ### 注意事项 在实施分库分表之前,需要仔细评估其必要性,并制定详细的实施计划。同时,也要考虑其他可能的替代方案,如使用 NoSQL 数据库、缓存策略等,以确定最适合特定业务需求的解决方案。此外,分库分表的设计应该基于详细的业务分析和数据访问模式分析,避免过度设计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值