mysql单表亿级数据优化_记一次Mysql单表亿级数据的拆分方案

在实际的应用场景中,当一个单表的数据量过亿时写入和查询的压力就会倍增,拆表在一定程度上是解决数据库单表瓶颈的方案之一,

在本次要拆分的表中有以下特征:

单表已过2亿

表数据量每天增量50万左右

表结构比较单一,用户关注用户行为表,用户关注一个用户会往表中写入一条数据。

表结构如下:

tb_user_friends:

uid, fid, from, create_date, inverse_date(反向索引时间戳)

其中表索引:

PRIMARY KEY (`uid`,`fid`),

KEY `idx_uid` (`uid`,`inverse_date`),

KEY `idx_fid` (`fid`,`inverse_date`),

如何选择拆分键

选择拆分键的选择往往由查询决定,常见的查询语句如下:

// 获取用户的关注列表

select fid from tb_user_friends where uid = xxx order by inverse_date limit 20;

// 获取用户的粉丝列表

select uid from tb_user_friends where fid = xxx order by inverse_date limit 20;

这就保证了我们查询用户的粉丝或者关注都需要从单一的一个表中能够获取到,所以如果单一的按照uid进行拆分,会导致查询粉丝需要从多张表中查询,这是不能接受的,所以这里分别以uidÿ

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
处理单表6亿+数据数据的问题是一个具有挑战性的任务,需要综合考虑性能、资源和数据一致性等因素。下面给出一个可实施落地的解决方案,具体步骤如下: 1. 数据预处理和分批刷入:将需要刷入的数据进行预处理,拆分成多个较小的数据文件或数据集。可以基于某个条件(如日期、ID范围等)进行分区,每个分区包含一部分数据。这样可以减少单次处理的数据量,提高处理效率。 2. 并行刷入:使用多个并发线程或者分布式计算框架(如Apache Spark)进行并行刷入操作。每个线程或节点负责处理一个或多个数据分区。并行刷入可以充分利用计算资源,加快刷入速度。 3. 批量插入和更新:对于每个数据分区,使用批量插入或更新操作来一次性处理多行数据,减少与数据库的交互次数。可以使用MySQL的LOAD DATA INFILE语句进行高效地批量插入,或者使用INSERT INTO ... VALUES (...)语句一次性插入多行数据。 4. 合理设置数据库参数:根据实际情况,合理设置MySQL数据库的参数,包括缓冲区大小、并发连接数、并行度等。这些参数的调整可以根据机器资源和数据量进行优化,提高数据库的性能和并发处理能力。 5. 监控和优化:在刷数据的过程中,持续监控系统的性能和资源使用情况。根据监控结果对系统进行优化,如调整线程数、增加机器资源等。同时,可以考虑使用数据库性能分析工具(如Explain语句)来优化SQL查询语句的性能。 6. 数据一致性保证:在刷数据过程中,需要确保数据的一致性。可以使用事务或者批量提交机制来保证数据的完整性和一致性。在刷入过程中,需要注意处理异常情况,如数据重复导致的冲突、数据丢失等。 需要注意的是,以上方案是一个基本的框架,具体实施时还需要根据实际情况进行调整和优化。刷数据操作可能会对正常业务产生影响,因此需要在合适的时间窗口内执行,并提前做好备份和风险评估。同时,建议在测试环境进行充分的压力测试和性能评估,以确保方案的可行性和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值