#为什么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表。

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

#邦芒人力# #校园招聘[超话]#
2021届校园招聘,尽在邦芒
岗位名称
JAVA软件开发工程师
岗位职责
1、参与项目的需求分析,根据需求文档定义的功能完成功能模块开发。
2、负责团队项目的开发,程序的测试与相关文档的编写。
任职要求
1、熟悉Oracle,MySQL,Postgresql等数据库。
2、熟悉基本的Java语法,熟练运用并深入理解常用算法和数据结构。
3、有强烈的开发安全和管理意识、责任心与团队合作能力。
工作地点
上海/浙江嘉兴

联系人:章老师13957385695 ,宋老师13957372500

第三天打卡get✔
今天基地考核 enmmm我感觉我准备的很不错然后也很放松但是不知道为什么考了倒数第三 enmmm感觉还是自己没有好好把握那些知识点 继续努力吧
有想过如果有一天我真的被踢出来了 其实也不要觉得不好 因为一切都是成长 继续努力好啦~
今天上了编译原理 感觉自己在做梦一样啥也没学的
还有马原也是[顶][顶]
说说今天的收获吧[微风]
今天知道怎么用MySQL增删查补哈哈哈哈哈哈还挺不错的 不过感觉自己还是没有记牢
然后四级听力终于对了12个了 感觉自己真的是一个听力有问题的孩子[衰][衰][衰]
今天依旧有在努力热爱我的生活哦[兔子][兔子][微风]


发布     👍 0 举报 写留言 🖊   
✋热门推荐
  • 由院党委副书记尹祚平和11名可爱的职工子女表演的情景演唱《让我们荡起双桨》《听妈妈讲过去的事情》顿时又将观众带回到那段难忘的童年的时光。由离退休老同志伴舞的女声
  • 应该是天道的铁粉,天道是怎么进去了的,米菲公司是怎么倒下去的,就是有人在背后搞得,散打为了把天道留在身边我是想尽了千方百计,也就是搞点凝聚力吧!我是真的不会玩超
  • 春日沙龙读书会,是收了一条就想收齐另外两色的裙子。( ˘•ω•˘ )各种华美细节设计不说了,它背面也有提拉摆抽带?
  • ​​​​我们之所以活得累,往往是因为放不下面子,把面子拿下来揣在衣兜里,素面朝天,你会发现原来生活真的没那么沉重[心]你到底是有多喜欢我为了见我又跑到我的梦里
  • 想念母亲,想念父亲,想念母亲做的饭菜,他们是世上对我最好的人,可是他们都不在了,好想他们……父母在人生尚有来处,父母去人生只剩归途!长大工作后,过年回来母亲也会
  • 我们短暂的一生,价值极大,既是把地球上的所有财宝给我们,若肉体死后我们的生命不能去高层生命空间,而是下到家畜界,那么,我们所拥有的全部地球财富又有什么意义?假如
  • 生活有波澜也没有上很多课 很累 累的我没什么脾气看问题的角度太重要了所以及时解决很重要我一直觉得 后面遇见我的人都很幸运因为我觉得自己在这个垃圾环境里真的成长的
  • 图 | 刘氏宗谱 经济文化的繁荣,促使各地工匠云集铅山,带来了各地的石雕文化和工艺,形成了铅山独特的石雕特色,产生出大批精美作品。石雕工艺品,主要有挂件、把件和
  • 疯狂看四级,完成了自己很满意的论文,吃了超级大的鸡腿饭,期待着跨年。在学校疯狂刷计算机题和漂亮舍友在宿舍拍大片,还去参加了地铁站的志愿活动(超开心的)5⃣月 五
  • 金刚经的智言慧语 :【如来性体显现应身之相,教化大千世界。为众生开此宝藏,皆令迴光反照 。】我们看这一段,首先我们要问,诸佛菩萨,包括阿罗汉,他为什麽到我们这个
  • 2022-2028年中国婴幼儿配方奶粉行业深度调查与投资前景评估报告#共研网(gonyn)市场调研报告#配方奶粉是以母乳为标准,对牛奶进行全面改造,使其最大限度
  • #张翰说孟子义唱歌幽默# 张汉法制咖粉丝好恐怖哦 ,各种辱骂女同事 ,你们也是女孩子吧 ,讲话咋那么恶毒呢?在这部短小睿智的讽刺短篇集中,凯雷特保持了他的黑色幽
  • 是我这段时间做过的最好吃的菜[色]于是做了第二份,用光了醋和蒜…但是吃不下了[苦涩]今晚的电影是百万美元宝贝。14Km/6h 39℃ 徒步清远牛湖陡壁灌木丛穿越
  • #购物分享# |还没用完就准备回购的精华它就是singuladerm的SOS精华最近三千子有点感冒,我也睡得比较晚哄完他就开始修图、看装修、看综艺啥的随便搞搞就
  • 其实哪是呀,每个入秋时刻,特别是黄昏时间,我总是会无尽的伤感,各种各样的往事遗憾对未来的恐惧担忧都会翻涌而出,太可怕了,也只能庆幸潮州的入秋也就是夏冬转折的这么
  • 后来看是宇弦啊关于高铁上是否应该售卖卫生巾的思考,下面有一个人的回复(如图1)让我瞬间想到了阿珂说的她前男友类型,虽然说的有一定道理但那种judge会让人不适,
  • 想象是不断生产的图像,在脑子里进进出出,你的念头一再把你带进想象。没有任何事情恒长不变,当自心产生矛盾体论的时候放下越发贪卓自性迷雾,此刻便是更进一步靠近禅定彼
  • 好久没回坡坡,起个早游一游,细细出了一身汗,大风一阵,整个人就清爽起来。这是菜市场的烟火气,这是端阳节气才有的味道。
  • #CRD就耀C爱##张若昀就耀C爱# @CRD克徕帝 我耀说爱生活爱自己,生活就是自己哄自己,余生很贵,女孩子就应该在最美的年纪里每天把自己打扮的漂漂亮亮的,
  • 日常12 前很多天的日子:罗欣怡大制作 六十岁再看肯定很感动/上半身热的要死穿搭/蝴蝶少女别管了/在1688买的袜子/没擦镜头和落日/余晖拍不厌/开口笑我可以