#为什么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 中。一般而言这里的数据同步都是异步处理,不会影响正常流程。

淦,看个美剧被气死[裂开]
本来以为女主已经在自身欲望和稳定婚姻之间已经找到平衡了老公和和美美冰释前嫌了
结尾突然来个大反转,那种为了反转而反转的剧情,女主又去找前男友了,编剧是不是有病[裂开]
是为了第二季吗[疑问]那你最好是有第二季哦[疑问]
没有的话我真的要气死[裂开]
虽然我是支持女主直面自己内心的欲望去和前男友在一起的(前男友太渣了看得我拳头都硬了)但是之前铺垫了那么多女主跟老公的美好生活现在突然来个这么离谱的反转我真是难受[裂开]

我挺喜欢这部剧的主题的,导演是女性,只有女性导演才会拍出这种大胆凝视男人的剧!把女性作为主体描述女性在sexlife中的欲望和身份,这样的题材越多越好,但是整部剧描绘地就很浅显,太飘在表面了,尤其是这个结尾,看得我窒息了[裂开]赶紧出第二季让我看看编剧怎么给它圆回来[裂开]

这两年来,不定期想到你,甚至梦见你,想起你的白球鞋,想起你说过的叼着烟干活的样子,想起你的冷漠,想起你的调皮,想起你奶奶在你十四岁说的快要可以结婚生孩子,想起一直没有琢磨透当初你到底喜欢的是谁,还一直在想怎么才能重新联系上你,想着是不是要结婚才能再次找到你,那你结婚会不会来请我吃酒。为什么啊,到底是为什么,我应该还在做梦吧,为什么我们会聊这些东西,不可以的。回来吧,都回来好吗?


发布     👍 0 举报 写留言 🖊   
✋热门推荐
  • 财禄之福财为养命之源,按照道家的说法,一个人财禄多少先天有一定之数,后天根据人的修为、努力、行善积德有所增减,通俗的讲,相当于幽冥之神为你在世间的行为做的一个绩
  • 正如极氪X配备的Microfiber超纤绒眼镜盒;玫瑰金点缀的B柱挂钩、飞机拨杆设计玻璃升降按键等,将生活的精致感运用到产品打造中,更是新奢美学的点睛之笔。凭借
  • 本人目前为止住过36一晚的店,也住过540一晚(以携程标价为参考)的店了,感想是,好想家啊啊啊啊啊啊啊啊啊啊啊 我真的不太能接受公共卫生间 特别是有人没冲厕所的
  • 我就大概是这个样子,会痴迷于一个自己想象出的事物,并不爱它的寄托,它的扮演者。(当然我知道我干别的大概率也是浪费生命,没按照我自己想法过我自己的人生我就是不爽。
  • 【 村上春树经典语录 】 1、如果你掉进了黑暗里,你能做的,不过是静心等待,直到你的双眼适应黑暗。 2、从今天起,你要去做一个不动声色的人。不准情绪化,不准
  • ”问其姓名,俯而不答惟江上之清风,与山间之明月,耳得之而为声,目遇之而成色,取之无禁,用之不竭,是造物者之无尽藏也,而吾与子之所共适清风徐来,水波不兴梦一道士,
  • 感恩师父[合十][合十][合十]如果你能像丁学芳一样,为了人们的健康,一生都在追求,我也代表天地为你保驾护航,一个人的德性,决定了你的一生,也决定了你能不能成长
  • 爷爷在我心中总是看电影那一刻,年轻的模样。年华易逝,要如何抓住每一刻美好的样子?
  • [交税]:裁判给选手看的板板是啥(还有的问题想不起来了[喵喵])[抱抱]然后就是不听劝的孩子[舔屏]还是去著名的瓜格逛了逛,我是微博的三坑粉,可以说是忠实老粉了
  •   “商丘好人”群体在不断扩大,他们以自己一个个平凡的个体,践行着中华民族绵延不息的“学为好人”的价值追求,从他们身上展现出中华道德风化和传统美德的影子,让人感
  • 我想,阳光总是一如既往,每日地赐予世界以温暖与光芒,这是阳光的不老;而若普照万物,即使历经岁月,都依旧能带来不变的感动与情愫,这才是阳光的不锈。#阳光信用[超话
  • 这种极端父母很可能是边缘型人格障碍,这类人约占人群的2%-4%,TA们通常表现得能够适应社会,甚至“很迷人”但在亲子间往往有以下表现:1.缺乏自我认知,性格脾气
  • #算命占卜通[超话]#老天不给你困难,你又如何看透人心;老天不给你失败,你又如何发现身边的人是真是假;老天不给你孤独,你又如何反思自省;老天不给你生命中配上君子
  • 小恩 你已经九个月了 从今天开始 妈妈决定给你断奶了 这两百多天的羁绊 我并不是想解脱 更多的是不舍 舍不得你所在我怀里的日子 每次看见你奶呼呼依赖妈妈的时候我
  • 研究发现,在高度近视性斜视患者中,后巩膜葡萄肿的发生率非常高,球后组织在肌锥中是向颢上方移位的,而不是向肌锥最薄弱的方向移位,而且眼轴长与外直肌下移幅度和斜视度
  • (其实并非体力活本身):承认并接纳自己的痛苦感受;允许自己休息,暂停一下;“自主性”是决定工作幸福感的关键;回归真实和简单的生活:吃饭、运动、晒太阳、和人交谈…
  • 【F1与德国润滑油品牌Liqui Moly续约】日前,F1和德国润滑油品牌Liqui Moly续签了2023年国际汽联一级方程式世界锦标赛的合作伙伴关系,这也是
  • 知道此理,回头再看你的修行之路,为了自己离苦得乐,跳出三界,抛妻弃子,不孝父母,你这德性,禽兽不如,还妄想成什么佛呢? 治病,修行没有什么区别,治病对凡夫而言
  • 还有,劳资愿意在自己微博说啥话是劳资的事,p事管太多,请取关,我又不是什么好人我不知道我们这算一个怎么样的时期 平淡且非必要不说话只希望5.11的你 觉得我不是
  • 心在你身上,我们对他好,两个人相处越过越幸福;心不在你身上,我们对他好,他觉得是负重,我们自己也是心不甘情不愿,何必呢?其实不用时刻去想是不是得罪人了,因为即使