#为什么MySQL数据量大了要分库分表#
是这样的。随着用户量的激增和时间的堆砌,存在数据库里面的数据越来越多,此时的数据库就会产生瓶颈,出现资源报警、查询慢等场景。
首先单机数据库所能承载的连接数、I/O及网络的吞吐等都是有限的,所以当并发量上来了之后,数据库就渐渐顶不住了。再则,如果单表的数据量过大,查询的性能也会下降。因为数据越多 B+ 树就越高,树越高则查询 I/O 的次数就越多,那么性能也就越差。因为上述的原因,不得已就得上分库分表了。把以前存在一个数据库实例里的数据拆分成多个数据库实例,部署在不同的服务器中,这是分库。把以前存在一张表里面的数据拆分成多张表,这是分表。一般而言:分表:是为了解决由于单张表数据量多大,而导致查询慢的问题。大致三、四千万行数据就得拆分,不过具体还是得看每一行的数据量大小,有些字段都很小的可能支持更多行数,有些字段大的可能一千万就顶不住了。
分库:是为了解决服务器资源受单机限制,顶不住高并发访问的问题,把请求分配到多台服务器上,降低服务器压力。顺着这个思路,再接着追问几个常见面试题。你们一般怎么分库的?一般分库都是按照业务划分的,比如订单库、用户库等等。有时候会针对一些特殊的库再作切分,比如一些活动相关的库都做了拆分。因为做活动的时候并发可能会比较高,怕影响现有的核心业务,所以即使有关联,也会单独做拆分。
那你觉得分库会带来什么问题呢? 首先是事务的问题。我们使用关系型数据库,有很大一点在于它保证事务完整性。而分库之后单机事务就用不上了,必须使用分布式事务来解决,而分布式事务基本的都是残缺的(我之前文章把分布式事务汇总了一波,后台搜索分布式事务就有了)。这是很重要的一点需要考虑。 连表 JOIN 问题在一个库中的时候我们还可以利用 JOIN 来连表查询,而跨库了之后就无法使用 JOIN 了。此时的解决方案就是在业务代码中进行关联,也就是先把一个表的数据查出来,然后通过得到的结果再去查另一张表,然后利用代码来关联得到最终的结果。这种方式实现起来稍微比较复杂,不过也是可以接受的。还有可以适当的冗余一些字段。比如以前的表就存储一个关联 ID,但是业务时常要求返回对应的 Name 或者其他字段。这时候就可以把这些字段冗余到当前表中,来去除需要关联的操作。那你们怎么分表的?分表其实有两种:垂直分表水平分表垂直分表,来看个图,很直观:
垂直分表就是把一些不常用的大字段剥离出去。像上面的例子:用户名是很常见的搜索结果,性别和年龄占用的空间又不大,而地址和个人简介占用的空间相对而言就较大,我们都知道一个数据页的空间是有限的,把一些无用的数据拆分出去,一页就能存放更多行的数据。内存存放更多有用的数据,就减少了磁盘的访问次数,性能就得到提升。水平分表,则是因为一张表内的数据太多了,上文也提到了数据越多 B+ 树就越高,访问的性能就差,所以进行水平拆分。
其实不管这些,浅显的理解下,在一百个数据里面找一个数据快,还是在一万个数据里面找一个数据快?即使有索引,那厚的书目录多,翻目录也慢~那分表会有什么问题?垂直分表还好,就是需要关联一下,而水平分表就有点麻烦了。 排序、count、分页问题如果一个用户的数据被拆分到多个表中,那查询结果分页就不像以前单张表那样直接就能查出来了,像 count 操作也是一样的。只能由业务代码来实现或者用中间件将各表中的数据汇总、排序、分页然后返回。像 count 操作的结果其实可以缓存下来,然后每次数据增删都更新计数。
路由问题分表的路由可以分:Hash 路由范围路由路由表Hash 路由,其实就是选择表中的某一列,然后进行 Hash 运算,将 Hash 运算得到的结果再对子表数进行取模,这样就能均匀的将数据分到不同的子表上。这跟 HashMap 选哪个桶是一样的原理。优点就是数据分布均匀。缺点就是增加子表的时候麻烦,想想 HashMap的扩容,是不是得搬迁数据?这个分表也是一样的,我们可都知道,数据迁移一件麻烦事!范围路由,其实很简单,可以是时间,也可以是地址,表示一定的范围的即可。比如本来一张 User 表,我可以分 User_HZ、User_BJ、User_SH,按照地名来划分 User。再比如 log 表,我可以将表分为 log_202103、 log_202104,把日志按照年月来划分。优点就是相对而言比较容易扩展,比如现在来个 GZ,那就加个 User_GZ。如果到了 5 月,那就建个 log_202105。缺点就是数据可能分布不均匀,例如 BJ 的用户特别多或者某个月搞了促销,日志量特别大,等等。路由表,就是专门搞个表来记录路由信息,来看个图就很清楚了。
从图中我们就能得知,UserID 为 2 的用户数据在要去 User_3 这个用户表查询。优点就是灵活咯,如果要迁移数据,直接迁移然后路由表一改就完事儿了~缺点就是得多查一次,每次查询都需要访问路由表,不过这个一般会做缓存的。 全局主键问题以前单表的时候很简单,就是主键自增,现在分表了之后就有点尴尬了。所以需要一些手段来保证全局主键唯一。还是自增,只不过自增步长设置一下。比如现在有三张表,步长设置为3,三张表 ID 初始值分别是1、2、3。 这样第一张表的 ID 增长是 1、4、7。第二张表是2、5、8。第三张表是3、6、9,这样就不会重复了。UUID,这种最简单,但是不连续的主键插入会导致严重的页分裂,性能比较差。分布式 ID,比较出名的就是 Twitter 开源的 sonwflake 雪花算法,具体就不展开了,不然就又是一篇文章了,简单点利用 redis 来递增也行。
那上面说的路由问题的 Sharding-Key 如何设计呢?我们分表是按照某个列来拆分的,那个列就是 Sharding-Key,查询的时候必须带上这个列才行。例如上面提到的 log_202103,那表明查询条件一定得带上日期,这样才能找到正确的表。所以设计上得考虑查询的条件来作为 Sharding-Key。举个常常会被问的订单表 Sharding-Key 例子。你想着查找订单的时候会通过订单号去找,所以应该利用订单 ID 来作为 Sharding-Key。但是你想想,你打开外卖软件想查找你的历史订单的时候,你是没有订单 ID 的,你只有你的 UserID,那此时只能把所有子表都通过 UserID 遍历一遍,这样效率就很低了!所以你想着那用 UserID 来作为 Sharding-Key 吧!
但是,商家呢?商家肯定关心自己今天卖了多少单,所以他也要查找订单,但他只有自己的商家 ID,所以如果要查询订单,只能把所有子表都通过商家 ID 遍历一遍,这样效率就很低了!所以 Sharding-Key 是满足不了所有查询需求的,只能曲线救国。一般做法就是冗余数据。将订单同步到另一张表中给商家使用,这个表按商家 ID 来作为 Sharding-Key,也可以将数据同步到 ES 中。一般而言这里的数据同步都是异步处理,不会影响正常流程。

#棉花美娃娃[超话]# 曝光一个骗子,我3月份刚入坑的时候,买了一个ttt。最近ttt补邮,我私信联系她,但她一直没有回我(有发微博,但随后又删了)后面我发微博说,我有可能遇到pz了,有姐妹提醒我说,微博可能吞私信,让我去闲鱼。如图所示,她已读第一条信息,但一直没回我。不过也是我蠢,当时刚入坑,也没要订单号,以为走闲鱼就好了[骷髅][骷髅][骷髅] https://t.cn/A65AceDs

后续
加了微信,一说我是买ttt的,就把朋友圈锁了,然后装傻充愣和不回消息[good]

再后续
我没耐心了,直接删了,希望姐妹们以后收娃都看仔细些

上线啦!突‮想然‬到几件事
1️⃣️1️⃣之前dy很‮火上‬的凡叫兽,靠‮美喷‬瞳火的那个,被‮诉起‬造‮判谣‬刑了
2️⃣️2️⃣之前‮跟着‬人da代标‮美说‬瞳‮问有‬题的“丁‮医香‬生”公众号,已‮把经‬那‮文篇‬章删了,并‮接且‬了各‮美种‬瞳➕护理‮品产‬推广
3️⃣️3️⃣重点‮一说‬下最近‮知不‬道‮谁被‬科普带火的“透氧率”问题。这‮个是‬很‮之久‬前在业‮就内‬被参‮的考‬东西,但‮一是‬直‮放不‬出说来的原因,是‮为因‬单独‮它看‬一点‮没都‬参考性‼️️‼️️‼️️透‮率氧‬再高,镜‮也片‬有‮能可‬不舒服,比‮很如‬硬很磨眼,单‮看独‬毫它‮意无‬义,这只‮工是‬厂产生‮一的‬个指标,不‮轻要‬信网红!!!真‮佩正‬戴‮是还‬得看自己,因‮千为‬人千眼,像‮护就‬肤品‮样一‬是‮有没‬标准答案的,找‮适到‬合自己眼睛的才是最好的


发布     👍 0 举报 写留言 🖊   
✋热门推荐
  • 茑屋书店的品牌经营策略:“让对生活有品质追求的人更容易找到对味的书籍、音乐或电影”这是茑屋创始人增田宗昭的核心的经营理念。 方所旗下的方庭书店更具“小众腔调
  • 意念作为生命的核心,自然也有自己的振动频率,也有自己的能量场。高维的意念可以在任何比它低层的空间和世界穿梭,来去自如,而低维到高维就需要通过不断的提升自己,增加
  • 当然,我也不怎么搭理他,反正我要走的,何必刚刚熟了就又要不熟了,你只要负责讨好我奶奶,让她开心就行了。奶奶脚边的小白眼狼也嗷了一下,仿佛在应和我。
  • 给大家分享一个玩王者荣耀的事 今天微信局的一把排位,原本会玩的妲己被队友给抢了,后来选了一个李元芳。时隔几十天,手生的操作加上网络的延迟,拿了一个双杀后被辅助钟
  • 发布活动现场通过对江苏奥德盛海洋装备服务有限公司总经理周佳超、江阴澄港拖轮船务有限公司副总经理车国清、江阴退役军人事务局局长宦雪忠、无锡市公安局已退休高级警长王
  • 真的好喜欢骑着小电驴在路上唱歌的感觉[许愿星]烦恼都拜拜烦恼都走开[揣手]我明天就忘记这几天发生的事情,就当我们没有联系过,就当你没想起来我过,就当我没有哭过,
  • 2019年5月,印度中央污染控制委员会(CPCB)曾表示……#疫情另类感想# 疫情的发生已经近五个月了在这期间天变蓝了 水变清了 空气质量更好了 这和人类活
  • 8月底这轮反复之后这种情况更加明显了,最极端的例子包括吉利icon突然起死回生,就是因为女性进店客户暴增。(要注意大众最近的调整,ID一线整体资源在迪斯走后可以
  • 其后第16号病例和第40号病例先后出现症状并到医院就诊,并于1月25日、28日确诊,目前正在定点医院隔离治疗。】2月5日下午,“海南省新型冠状病毒感染的肺炎疫情
  • #恋人往事[超话]##越长大才能看得懂的台词# 十里平湖霜满天,寸寸相思愁华年! 对月形单望相互,只羡鸳鸯不羡仙! 心坚强情感慰藉,人完美精神知音! 人生如梦岁
  • 另外,对于产业链上因为短期供需紧张导致的价格剧烈波动,也在进行梳理,从2020年的玻璃、硅料以及今年的EVA粒子等,都会进行一定的战略采购布局,通过强化上游供应
  • ?股市基础理论知识--常见见顶K线组合(十六种)常见见顶K线组合(十六种)一、十字星十字星是指收盘价和开盘价在同一价位或者相近,没有实体或实体极其微小的特殊的K
  • 后来做了吐司pizza,一些简单的食材,面包酥脆可口,上面既有蔬菜的清香又有浓浓的奶香,搭配起来美滋滋[小黄人高兴]晚上和老友出去转转,觉得脸部护理真的很重要,
  • 刚上大学的时候我只认识图书馆,舍友怕我丢了次次都在图书馆等我,谢谢他们[泪]可现在的我还是路的奴隶[泪]p8是朋友跟我说的,看了看那时候的状态确实很难过哈,现在
  • 滁州市新冠肺炎疫情防控应急指挥部2022年9月13日#上海美食[超话]# 超韩系的韩料店就在环球港5楼,新开的人气超旺,休息日建议提早现场排队领号。#滁州##滁
  • 生日快乐~要说的太多了这里能写的字数也少...但是首先你是对我来说很重要的人,是我见过的最善良、最体贴、最充满爱的人!乍一看《快乐再出发》评分那么高以为是营销套
  • 今儿你总没有任何理由了吧,我今儿就是要吃西红柿炒蛋,谁也别想拦着我。上次说炒,你说蒸了米饭,要不咱来个汤吧,被你一忽悠,就来了个汤。
  • #蔡卓妍[超话]# 7号第一次见阿Sa近在眼前激动的要死,9号赶飞机同在一个夜市等了半天近在咫尺却要错过, 并且因为航班要居家隔离[笑cry],这几天看路透后
  • 病例25:孙某某,男,25岁,系病例5的陪护人员。病例22:田某某,女,75岁,河南鹿邑人,市六院结核病区病人,系病例11的母亲。
  • ✨祝自己可以稍稍过好22岁以后的生活,慢慢的成长,变得“钝”一点,减少半夜emo和总是羡慕别人的生活而要自己努力[蛋糕][许愿星]✨希望自己能像20不惑里的姜小