2.4 水平扩展实战:支撑亿级数据的分库分表策略
2.4 水平扩展实战:支撑亿级数据的分库分表策略📚 学习目标通过本节学习,你将掌握:✅ 分库分表的核心原理和适用场景✅ 不同分片策略(哈希、范围、目录等)的选择✅ 应用层和中间件分库分表的实现方法✅ 分库分表带来的复杂性问题及解决方案✅ 分库分表架构的设计原则和最佳实践🎯 学习收获学完本节后,你将能够:架构设计:设计支撑亿级数据的分库分表架构方案选型:根据业务特点选择合适的分片策略问题解决:处理分库分表带来的复杂性问题性能优化:通过分库分表提升系统整体性能💡 实际场景引入场景一:单表数据量过大导致性能下降问题描述:某电商平台的订单表数据量达到5亿条,单表查询和写入性能急剧下降。即使添加了索引,查询时间仍然超过10秒,严重影响用户体验。你的任务:如何通过分库分表解决单表性能问题?场景二:跨库查询的性能挑战问题描述:某系统实施了分库分表后,发现跨库查询(如统计报表)性能很差,需要聚合多个库的数据,查询时间超过1分钟。你的任务:如何优化跨库查询性能?随着业务的快速发展,单个MySQL实例已经无法满足日益增长的数据存储和访问需求。当数据量达到亿级甚至更高时,传统的垂直扩展方式成本高昂且存在瓶颈,水平扩展成为必然选择。分库分表作为最常见的水平扩展方案,能够有效分散数据存储压力和查询负载,提升系统整体性能。本节将深入探讨MySQL水平扩展的各种方案,分析其瓶颈和适用场景,并提供详细的实施指导。目前业界数据库水平扩展方案介绍1. 应用层分库分表在应用层实现数据分片是最直接的方式:// Sharding策略示例publicclassUserShardingStrategy{privatestaticfinalintSHARDING_COUNT=16;publicStringdetermineDatabase(LonguserId){intindex=(int)(userId%SHARDING_COUNT);return"user_db_"+index;}publicStringdetermineTable(LonguserId){intindex=(int)((userId/SHARDING_COUNT)%SHARDING_COUNT);return"user_table_"+index;}}// MyBatis集成分片@Select("SELECT * FROM user_table_${tableIndex} WHERE user_id = #{userId}")UserfindUser(@Param("tableIndex")inttableIndex,@Param("userId")LonguserId);2. 中间件分库分表使用专业的分库分表中间件:ShardingSphere# ShardingSphere配置示例dataSources:ds0:url:jdbc:mysql://localhost:3306/ds0username:rootpassword:passwordds1:url:jdbc:mysql://localhost:3306/ds1username:rootpassword:passwordrules:-!SHARDINGtables:user:actualDataNodes:ds${0..1}.user_${0..3}tableStrategy:standard:shardingColumn:user_idshardingAlgorithmName:user-table-inlinedatabaseStrategy:standard:shardingColumn:user_idshardingAlgorithmName:user-database-inlineshardingAlgorithms:user-table-inline:type:INLINEprops:algorithm-expression:user_${user_id % 4}user-database-inline:type:INLINEprops:algorithm-expression:ds${user_id % 2}MyCAT!-- MyCAT配置示例 --?xml version="1.0"?!DOCTYPEmycat:schemaSYSTEM"schema.dtd"mycat:schemaxmlns:mycat="http://io.mycat/"schemaname="TESTDB"checkSQLschema="false"sqlMaxLimit="100"tablename="user"dataNode="dn1,dn2,dn3,dn4"rule="sharding-by-mod"//schemadataNodename="dn1"dataHost="host1"database="db1"/dataNodename="dn2"dataHost="host1"database="db2"/dataNodename="dn3"dataHost="host2"database="db1"/dataNodename="dn4"dataHost="host2"database="db2"/dataHostname="host1"maxCon="1000"minCon="10"balance="0"writeType="0"dbType="mysql"dbDriver="native"heartbeatselect 1/heartbeatwriteHosthost="hostM1"url="localhost:3306"user="root"password="password"//dataHost/mycat:schema3. 数据库代理层使用代理层实现透明分片:ProxySQL# ProxySQL配置示例 mysql_servers: ( { hostgroup_id = 1, hostname = "192.168.1.101", port = 3306 }, { hostgroup_id = 1, hostname = "192.168.1.102", port = 3306 }, { hostgroup_id = 2, hostname = "192.168.1.103", port = 3306 }, { hostgroup_id = 2, hostname = "192.168.1.104", port = 3306 } ) mysql_users: ( { username = "app_user", password = "password", default_hostgroup = 1 } ) mysql_query_rules: ( { rule_id = 1, active = 1, match_digest = "^SELECT.*user_id=([0-9]+)", destination_hostgroup = 1, apply = 1 } )4. 新一代分布式数据库TiDB-- TiDB兼容MySQL语法,自动处理分片CREATETABLEuser(user_idBIGINTPRIMARYKEYAUTO_RANDOM,nameVARCHAR(100),emailVARCHAR(100),created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP);-- 查询时无需关心分片细节SELECT*FROMuserWHEREuser_id=123456789;每种水平扩展方案容易碰上的瓶颈1. 应用层分库分表瓶颈复杂查询支持有限// 跨分片JOIN查询复杂// 原始SQL(单库)SELECT u.name,o.order_amount FROM user u JOIN orders o ON u.user_id=o.user_id WHERE u.user_id BETWEEN1000AND2000;// 分片后需要应用层处理publicListUserOrderInfogetUserOrders(LongstartUserId,LongendUserId){ListUserOrderInforesult=newArrayList();// 1. 确定涉及的分片SetStringshards=determineShards(startUserId,endUserId);// 2. 分别查询各分片for(Stringshard:shards){ListUserusers=userMapper.selectUsersFromShard(shard,startUserId,endUserId);ListLonguserIds=users.stream().map(User::getUserId).collect(Collectors.toList());ListOrderorders=orderMapper.selectOrdersByUserIds(shard,userIds);// 3. 应用层JOINresult.addAll(mergeUserOrders(users,orders));}returnresult;}事务处理复杂// 分布式事务处理@ShardingTransactionType(TransactionType.XA)@TransactionalpublicvoidcreateUserAndOrder(Useruser,Orderorder){// 在不同分片上创建用户和订单userService.createUser(user);orderService.createOrder(order);}2. 中间件分库分表瓶颈性能损耗-- 中间件解析和路由SQL需要额外时间-- 复杂SQL可能导致中间件成为瓶颈SELECTu.*,o.*

相关新闻

2.3 数据恢复神技:四种方案实现数据快速找回

2.3 数据恢复神技:四种方案实现数据快速找回

2.3 数据恢复神技:四种方案实现数据快速找回 📚 学习目标 通过本节学习,你将掌握: ✅ 四种不同级别的数据恢复方案(秒级、分钟级、小时级、天级) ✅ binlog恢复、备份恢复、物理恢复等恢复技术 ✅ 数据恢复的完整流程和最佳实践 ✅ 误操作、硬件故障等不同场景的恢复方…

2026/7/5 9:09:14 阅读更多 →
横评后发现! 更贴合自考的降AI率软件 千笔·降AIGC助手 VS speedai

横评后发现! 更贴合自考的降AI率软件 千笔·降AIGC助手 VS speedai

在AI技术迅猛发展的今天,越来越多的学生和研究者开始借助AI工具辅助论文写作,以提升效率和质量。然而,随之而来的“AI率超标”问题却成为学术道路上的一大难题。随着查重系统对AI生成内容的识别能力不断提升,许多学生发现&#xf…

2026/5/17 2:43:44 阅读更多 →
直播录制神器,绝了

直播录制神器,绝了

今天给大家带来一款上线没多久的直播录制工具,有需要的小伙伴及时下载收藏。 软件介绍 今天介绍的这款直播录制工具StreamCap是一款支持某音、某手、某鱼、某站等国内外的主流直播视频网站。 这款软件在GitHub上开源免费,点击【开始录制】进入到录制设置…

2026/7/6 9:33:18 阅读更多 →

最新新闻

构建弹性FastDFS文件存储系统:从超时容错到全链路治理的架构演进

构建弹性FastDFS文件存储系统:从超时容错到全链路治理的架构演进

构建弹性FastDFS文件存储系统:从超时容错到全链路治理的架构演进 【免费下载链接】fastdfs FastDFS is a high performance distributed file system (DFS). Its major functions include: file storing, file syncing and file accessing, and design for high cap…

2026/7/6 21:10:05 阅读更多 →
Hugo Blog Awesome RSS Feed配置:让读者随时订阅你的内容

Hugo Blog Awesome RSS Feed配置:让读者随时订阅你的内容

Hugo Blog Awesome RSS Feed配置:让读者随时订阅你的内容 【免费下载链接】hugo-blog-awesome Fast, minimal blog with dark mode support. 项目地址: https://gitcode.com/gh_mirrors/hu/hugo-blog-awesome Hugo Blog Awesome是一款支持暗色模式的快速极简…

2026/7/6 21:10:05 阅读更多 →
企业级React组件库架构设计:如何通过开放代码模式解决前端组件复用难题

企业级React组件库架构设计:如何通过开放代码模式解决前端组件复用难题

企业级React组件库架构设计:如何通过开放代码模式解决前端组件复用难题 【免费下载链接】ui A set of beautifully-designed, accessible components and a code distribution platform. Works with your favorite frameworks. Open Source. Open Code. 项目地址:…

2026/7/6 21:08:01 阅读更多 →
zgrab输出数据解析:JSON格式与网络情报提取指南

zgrab输出数据解析:JSON格式与网络情报提取指南

zgrab输出数据解析:JSON格式与网络情报提取指南 【免费下载链接】zgrab **DEPRECATED** This project has been replaced by https://github.com/zmap/zgrab2 项目地址: https://gitcode.com/gh_mirrors/zg/zgrab zgrab是一款功能强大的网络扫描工具&#xf…

2026/7/6 21:03:58 阅读更多 →
5个实战场景深度解析:如何高效使用动态网格组件

5个实战场景深度解析:如何高效使用动态网格组件

5个实战场景深度解析:如何高效使用动态网格组件 【免费下载链接】RealtimeMeshComponent Unreal Engine 5 plugin component for rendering runtime generated content. 项目地址: https://gitcode.com/gh_mirrors/re/RealtimeMeshComponent RealtimeMeshCom…

2026/7/6 21:01:56 阅读更多 →
专业级FOC电机控制:开源平衡车固件架构深度解析

专业级FOC电机控制:开源平衡车固件架构深度解析

专业级FOC电机控制:开源平衡车固件架构深度解析 【免费下载链接】hoverboard-firmware-hack-FOC With Field Oriented Control (FOC) 项目地址: https://gitcode.com/GitHub_Trending/ho/hoverboard-firmware-hack-FOC hoverboard-firmware-hack-FOC是一款基…

2026/7/6 21:01:56 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻