#为什么MySQL数据量大了要分库分表#
在文章开头先抛几个问题:
(1)什么时候才需要分库分表呢?我们的评判标准是什么?
(2)一张表存储了多少数据的时候,才需要考虑分库分表?
(3)数据增长速度很快,每天产生多少数据,才需要考虑做分库分表?这些问题你都搞清楚了吗?相信看完这篇文章会有答案。

为什么要分库分表?首先回答一下为什么要分库分表,答案很简单:数据库出现性能瓶颈。用大白话来说就是数据库快扛不住了。数据库出现性能瓶颈,对外表现有几个方面:大量请求阻塞在高并发场景下,大量请求都需要操作数据库,导致连接数不够了,请求处于阻塞状态。SQL 操作变慢如果数据库中存在一张上亿数据量的表,一条 SQL 没有命中索引会全表扫描,这个查询耗时会非常久。存储出现问题业务量剧增,单库数据量越来越大,给存储造成巨大压力。从机器的角度看,性能瓶颈无非就是CPU、内存、磁盘、网络这些,要解决性能瓶颈最简单粗暴的办法就是提升机器性能,但是通过这种方法成本和收益投入比往往又太高了,不划算,所以重点还是要从软件角度入手。

数据库相关优化方案数据库优化方案很多,主要分为两大类:软件层面、硬件层面。软件层面包括:SQL 调优、表结构优化、读写分离、数据库集群、分库分表等;硬件层面主要是增加机器性能。SQL 调优SQL 调优往往是解决数据库问题的第一步,往往投入少部分精力就能获得较大的收益。SQL 调优主要目的是尽可能的让那些慢 SQL 变快,手段其实也很简单就是让 SQL 执行尽量命中索引。开启慢 SQL 记录如果你使用的是 Mysql,需要在 Mysql 配置文件中配置几个参数即可。

调优的工具常常会用到 explain 这个命令来查看 SQL 语句的执行计划,通过观察执行结果很容易就知道该 SQL 语句是不是全表扫描、有没有命中索引。select id, age, gender from user where name = '爱笑的架构师';返回有一列叫“type”,常见取值有:ALL、index、range、 ref、eq_ref、const、system、NULL(从左到右,性能从差到好)ALL 代表这条 SQL 语句全表扫描了,需要优化。一般来说需要达到range 级别及以上。表结构优化以一个场景举例说明:“user”表中有 user_id、nickname 等字段,“order”表中有order_id、user_id等字段,如果想拿到用户昵称怎么办?

一般情况是通过 join 关联表操作,在查询订单表时关联查询用户表,从而获取导用户昵称。但是随着业务量增加,订单表和用户表肯定也是暴增,这时候通过两个表关联数据就比较费力了,为了取一个昵称字段而不得不关联查询几十上百万的用户表,其速度可想而知。这个时候可以尝试将 nickname 这个字段加到 order 表中(order_id、user_id、nickname),这种做法通常叫做数据库表冗余字段。这样做的好处展示订单列表时不需要再关联查询用户表了。

冗余字段的做法也有一个弊端,如果这个字段更新会同时涉及到多个表的更新,因此在选择冗余字段时要尽量选择不经常更新的字段。架构优化当单台数据库实例扛不住,我们可以增加实例组成集群对外服务。当发现读请求明显多于写请求时,我们可以让主实例负责写,从实例对外提供读的能力;如果读实例压力依然很大,可以在数据库前面加入缓存如 redis,让请求优先从缓存取数据减少数据库访问。缓存分担了部分压力后,数据库依然是瓶颈,这个时候就可以考虑分库分表的方案了,后面会详细介绍。硬件优化硬件成本非常高,一般来说不可能遇到数据库性能瓶颈就去升级硬件。在前期业务量比较小的时候,升级硬件数据库性能可以得到较大提升;但是在后期,升级硬件得到的收益就不那么明显了。

分库分表详解
下面我们以一个商城系统为例逐步讲解数据库是如何一步步演进。
单应用单数据库
在早期创业阶段想做一个商城系统,基本就是一个系统包含多个基础功能模块,最后打包成一个 war 包部署,这就是典型的单体架构应用。如上图,商城系统包括主页 Portal 模板、用户模块、订单模块、库存模块等,所有的模块都共有一个数据库,通常数据库中有非常多的表。因为用户量不大,这样的架构在早期完全适用,开发者可以拿着 demo到处找(骗)投资人。一旦拿到投资人的钱,业务就要开始大规模推广,同时系统架构也要匹配业务的快速发展。多应用单数据库在前期为了抢占市场,这一套系统不停地迭代更新,代码量越来越大,架构也变得越来越臃肿,现在随着系统访问压力逐渐增加,系统拆分就势在必行了。

为了保证业务平滑,系统架构重构也是分了几个阶段进行。第一个阶段将商城系统单体架构按照功能模块拆分为子服务,比如:Portal 服务、用户服务、订单服务、库存服务等。如上图,多个服务共享一个数据库,这样做的目的是底层数据库访问逻辑可以不用动,将影响降到最低。多应用多数据库随着业务推广力度加大,数据库终于成为了瓶颈,这个时候多个服务共享一个数据库基本不可行了。我们需要将每个服务相关的表拆出来单独建立一个数据库,这其实就是“分库”了。单数据库的能够支撑的并发量是有限的,拆成多个库可以使服务间不用竞争,提升服务的性能。

如上图,从一个大的数据中分出多个小的数据库,每个服务都对应一个数据库,这就是系统发展到一定阶段必要要做的“分库”操作。现在非常火的微服务架构也是一样的,如果只拆分应用不拆分数据库,不能解决根本问题,整个系统也很容易达到瓶颈。分表说完了分库,那什么时候分表呢?如果系统处于高速发展阶段,拿商城系统来说,一天下单量可能几十万,那数据库中的订单表增长就特别快,增长到一定阶段数据库查询效率就会出现明显下降。因此,当单表数据增量过快,业界流传是超过500万的数据量就要考虑分表了。当然500万只是一个经验值,大家可以根据实际情况做出决策。

那如何分表呢?分表有几个维度,一是水平切分和垂直切分,二是单库内分表和多库内分表。水平拆分和垂直拆分就拿用户表(user)来说,表中有7个字段:id,name,age,sex,nickname,description,如果 nickname 和 description 不常用,我们可以将其拆分为另外一张表:用户详细信息表,这样就由一张用户表拆分为了用户基本信息表+用户详细信息表,两张表结构不一样相互独立。但是从这个角度来看垂直拆分并没有从根本上解决单表数据量过大的问题,因此我们还是需要做一次水平拆分。

还有一种拆分方法,比如表中有一万条数据,我们拆分为两张表,id 为奇数的:1,3,5,7……放在 user1, id 为偶数的:2,4,6,8……放在 user2中,这样的拆分办法就是水平拆分了。水平拆分的方式也很多,除了上面说的按照 id 拆表,还可以按照时间维度取拆分,比如订单表,可以按每日、每月等进行拆分。每日表:只存储当天的数据。每月表:可以起一个定时任务将前一天的数据全部迁移到当月表。历史表:同样可以用定时任务把时间超过 30 天的数据迁移到 history表。总结一下水平拆分和垂直拆分的特点:垂直切分:基于表或字段划分,表结构不同。水平切分:基于数据划分,表结构相同,数据不同。单库内拆分和多库拆分拿水平拆分为例,每张表都拆分为了多个子表,多个子表存在于同一数据库中。比如下面用户表拆分为用户1表、用户2表。

在一个数据库中将一张表拆分为几个子表在一定程度上可以解决单表查询性能的问题,但是也会遇到一个问题:单数据库存储瓶颈。所以在业界用的更多的还是将子表拆分到多个数据库中。比如下图中,用户表拆分为两个子表,两个子表分别存在于不同的数据库中。
一句话总结:分表主要是为了减少单张表的大小,解决单表数据量带来的性能问题。

【早盘】美国假期来袭 金价震荡调整
黄金方面:上周五(7月2日)美国公布6月非农就业数据录得增加85万人,增幅高于预期。不过失业率从上个月的5.8%上升到5.9%,显示美国就业市场略显颓势。更为重要的是此前市场预期美联储将在今年晚些时候收紧货币政策,非农数据不太可能引发美联储提前缩减购债规模或是加息,或为金价上行提供支撑。

近期美国股票市场表现非常强劲,标普500指数连续7天创记录新高,显示市场对美国经济并不过分悲观,推动美元指数走强,警惕美元指数走强施压金价。

技术面:周线上,上周行情触底反弹,收较长下影线K线,本周有望延续反弹行情。日线上,连续多个交易日维持低位震荡调整。日内关注上方1795美元一线压力,下方关注1760美元一线支撑。

黄金价格走势图:黄金小时图

原油方面:欧佩克与会代表透露,虽然多数欧佩克+成员国支持8月至12月期间每月增产40万桶/日,同时将减产协议延长至明年年底的提议。但上周五(7月2日)的部长级会议没有达成协议,因为阿联酋持反对态度,要求欧佩克+提升该国用于计算减产的基线产量。欧佩克+未能就产量政策达成一致,短期这种僵局或将支撑油价上行。

不过欧佩克产油国集团仍将计划本周一(7月5日)继续会议,寻求在产量政策方面达成一致。投资者应当重点关注,若欧佩克将产量维持相对稳定,或将利好油价上行。

技术面:周线上,上周行情小幅上涨且收阳线,显示多头较为强势。日线上,行情破位上行,或将打开上行空间。日内关注上方76.88美元一线压力,下方关注74美元一线支撑。

原油价格走势图:原油小时图

重要声明:上述内容及观点仅供参考,不构成任何投资建议,投资者据此操作,风险自担。#外汇# #原油外汇[超话]# #投资理财[超话]#

狸花母猫,叫石榴,现在8个多月大。喵三联和狂犬都齐全,内外驱虫每月都做,疫苗本记录齐全,
身体很健康,从出生到现在没生过任何病,猫砂盆用的很熟练,很好养。现在和家里原住民不太对付,急寻领养,要求成年人,不离不弃,送猫日常用品和过渡猫粮。仅限西安渭南咸阳附近。有意愿的请在下面留言。#西安领养[超话]# #西安猫咪领养[超话]# #西安狗狗领养[超话]# #西安宠物领养[超话]# #西安流浪猫领养[超话]##给ta一个家# #领养代替购买# #萌宠的日常# #萌宠# #宠物# #萌宠集中营# #宠物人口普查# #宠物卖萌中心# #萌宠部落格# #家有萌宠# #宠物卖萌中心# #每日一善[超话]# #猫领养# #猫咪领养# #猫咪# #喵星人#


发布     👍 0 举报 写留言 🖊   
✋热门推荐
  • 我很喜欢,所以在这里和大家分享一下虽然是小众品牌,但是却非常的有质感,很高级。搅沫沫APP,西宁超流行的APP,是西宁8万多人的智慧之选,你值得拥有。
  • 当然,夏天的萤火虫、西瓜、栀子花,又会让我记起《少年心事总在夏》的故事碎片……也许是惺惺相惜吧,所以才会很珍惜这段相识[给你小心心]@凉色双木夕 我会一直期待你
  • 这位华侨女土,我预测过的,她人美,出身家庭普通,初中学历,在青春年华,命运之神把她推上中产层次,在本地方人称美富姐然而同样的人继续做同样的事,为什么这几年事业不
  • 《以爱互联 一网情牵》2019年武汉互联网行业联合会、“武汉约会”共同发起“武汉市互联网企业单身青年婚恋关爱行动,今天下午在武汉广电武汉约会鲁广店举行首场活动,
  • ☕️悠闲的下午时光来一杯自制咖啡新入手的keepcup随行杯配色有个可爱的名字:晴天☀️荷包蛋杯身是钢化玻璃杯盖是耐高温材质还有贴心的防烫胶条340ml的容量不
  • 起了个大早,只为虔诚,第一次这样,第一次跟着这帮人这样,也挺好,我自内心安稳,平静而踏实,现在回来,有点睏了,可是又要出发了,昨夜几个人“干瞪眼”算是好玩轻松了
  • 我们参与了《永远的7日之都》、《平安京》、《重装上阵》、《量子特攻》、《镇魔曲》、《刀塔传奇》、《剑与家园》、《镇魔曲》、《英魂之刃》为网易、畅游、三七互娱、
  • ”当这个话说出来之后,相信很多观众都被逗笑了,关键是张雨绮都不知道自己说对了没有,还得询问何炅和维嘉。要说张雨绮在这种不需要智商的游戏中还是非常在行的,她基本上
  • 带话题词发博参与活动,治愈每一个不愉悦的坏天气~>综合指数排名(发博量、互动量、内容质量综合系数排名):(日均全部博文量>10条,更有机会上榜)第1名:流
  • #田柾国[超话]# #田柾国自拍# 小猪带蝴蝶结很可爱小猪柾国春游要带小熊玩偶小猪的本体是兔兔还有一个是狗勾全世界最可爱的猪猪豆粉色小甜心猪妹猪妈咪心尖尖上的宝
  • 回眸 | 在冬夜,听音乐的篝火燃烧浪漫1月11日19:30,杭州爱乐乐团驻团指挥洪音携手青年大提琴演奏家聂佳鹏,与杭州爱乐乐团一起在杭州大剧院歌剧院,为观众献上
  • 他的经历,只怕这电影无法诠释更多。人的一生,小事无数,你能计较多少?
  • 皮皮看到了马妈妈,她问马妈妈:“你爱我吗?”马妈妈回答说,“我最爱你扑扇扑扇的小耳朵,我真的很爱你,但是——有人爱你比我多10倍”世界上最舒服的事大概就是,你等
  • 我们就类似第三方,所以只要有平台存在,这个项目就可以一直做 #李佳琦[超话]# 花西子的故事最近已经看腻了……来来回回就那么几个吐槽点还是杠精自认为,怼回去的欲
  • 另外除了拿货方便,你还可以和我一样做微商做淘宝,毕竟多一个范围你针对的人群就更广泛❗让你投资一次,拿货方便,卖货方便,多收入,多出单,你还有什么可担心❓后期也可
  • 然后一路都骑着在我前面不远,时不时回头确认我安全,在前方有危险的路段提前提醒我,我也因为一路跟着他,觉得特别安心。明天是#寒露# 节气,也要开始上班了哦!
  • [暗中观察R][暗中观察R][暗中观察R] 两位的稿子真的很写实,把现实的底层逻辑串联脱口秀喜剧技巧,又好笑又讽刺一语双关,中文语言艺术真是博大精深 【再说说其
  • 从现在开始一直用到初春,新鲜能穿的连衣裙的介绍第2弹!天鹅绒连衣裙¥6,900+tax。因为从正面看的时候连衣裙的高度会改变,只要把内搭变成颜色,看起来就会焕然
  • 全新轮胎潮鞋OFF-GRID 全地形轮胎大底,挑战极限冒险、尽情探索都市丛林 [SPECIAL] 以生产飞机轮胎起家,1947 年Palladium 收到法国外
  • 不论是阳宅当中的厂房,楼盘,小区,还是自建房。最忌讳的风水格局,便是顺水局。 什么是顺水局呢? 首先看一段古书对它的描述: 顺水局指穴前有水直流而去