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

杰西斯·罗宾逊是是英国女王的酒窖顾问,她曾被授予不列颠帝国勋章。她是世界上最著名的葡萄酒作家之一。她主编组织撰写的《牛津葡萄酒大辞典》被认为是世界上最权威的葡萄酒百科全书。她和休·约翰逊合著的《世界葡萄酒地图》成为全世界最重要的葡萄酒地图册之一。另外,她还是介绍了1368个葡萄品种的《酿酒葡萄品种》的合著者,这些书在世界范围内,都已成为葡萄酒标准的参考书。

杰西斯·罗宾逊选葡萄酒的10个诀窍:
1.尽量避免挑选那些储存在强光线位置,比如靠近店铺窗户或热源的葡萄酒。光线和热源会使葡萄酒失去果香和清新度。
2.找那些装瓶地址与葡萄产地尽可能接近的葡萄酒。如果生产商不是同一个的话,所有葡萄酒的酒标都需标明装瓶的地址,最起码要有邮编。注意类似这样的情况:一瓶新西兰的葡萄酒,却在英国装瓶。确实有越来越多的葡萄酒在全世界范围内运输,从生态产业角度来说,这对于那些不太贵的葡萄酒是可取的,但真正严肃的葡萄酒生产商仍会坚持自己装瓶。比如,去找那些酒标上有“葡萄酒原瓶产自南非西开普省”(Wine of Origin Western Cape,South Africa)字样的葡萄酒。
3.如果是一瓶取用软木塞的葡萄酒,选择那些平放储存的酒,这样会保证软木塞的湿度,将氧气挡在外面。
4.检查瓶颈处的液面。最好不要买那些葡萄酒直立放置时液面以上的空间多于2~3厘米的葡萄酒,因为这可能传递出一种讯号:太多有害的氧气已与葡萄酒接触。
5.对于精品葡萄酒,记住每个产区的好年份极其困难。杰西斯·罗宾逊的“5分法则”或许是个捷径:自1985年起,所有可以被5整除的年份都不错。
6.注意酒瓶背面标签的信息,如果它精细地描述酒的风味,推荐与什么食物搭配等,则可能暗示了过多的营销色彩。杰西斯·罗宾逊个人比较倾向看到的信息是描述这瓶酒是如何酿成的。
7.带上你的智能手机,以便查酒的评级、评论家的观点以及其他葡萄酒爱好者的点评。
8.去找那些独立的葡萄酒零售商寻找建议。如果他们所给出的建议不合适,那就再找另一家,直到找到满意的为止。
9.对于便宜的白葡萄酒,或者是桃红葡萄酒,要挑选最新的年份。
10.如果一瓶酒是特价酒,要问一下原因。有时,酒便宜是因为状况不好或者太老。
#东莞莞非实业投资有限公司#

有一次给菊厂邮件,对方半夜一点钟回复,虽然菊厂加班晚,但是人家给的高啊。昨天面试某宇宙所分所,月薪2k是哪来的脸要求我996啊[疑问]面试登记表还要填身高就离谱,面试从小学入学时间问到家庭地址再到父母感情男朋友情况,查户口都没这么细致的[费解]说主要给企业做法顾,如果我想做案子可以把他不想做的案子给我做[疑问]请问我是过来要饭的吗?


发布     👍 0 举报 写留言 🖊   
✋热门推荐
  • 即使命运的波涛汹涌,我们也从容面对,且行且歌,一边领略着不同的风景,一边在平凡生活中继续创造和耕耘。 生活,有时像清晨的阳光,明媚而耀眼;有时又如脚下的路,坎
  •   在这群年轻的姑娘里,我似乎没了什么本钱,但谁都不知道我还有一个本事…………《缠爱:今生,要定你》孟聿川舒渺刘康明《将门弃妇又震慑边关了!  在这群年轻的姑娘
  • 适合打工人发的朋友圈文案[心] 1、搬 2、随薪所欲 3、:到点收工 4、麻瓜打工日记 5、人未老 想养老 6、天天想辞职 月月拿全勤 7、努力不一定成功,不
  • 昏暗中,床上模糊勾勒出一个粽子的形状,是软绵的被子隆起.一只柔荑伸出,没有方向地摸索着床头,手指抓到手机后,迅速缩回被子里。不过几秒,被子掀开。
  • 缘分本来就稀薄寡淡,相伴一程已是万分感激,没有什么东西是一成不变的,没有谁能一直陪着谁,只要同行的时候是快乐的,就是好的相遇,至于怎么走散的并不重要。女人何苦为
  • 当自己宅在家里沉寂了好几月之后,因为一次并不是很想去的出差,倒是激活了我的生命能量,让我体会到了出门远行的好处和快乐,以前那个爱出门爱交友的我貌似又回来了。他很
  • 节点财经看来,“低价”是量贩零食店最大的竞争力,而低价的本质是对产业链的重塑。太阳底下没有新鲜事,价格战最后的解决方案似乎总是合并,以往互联网行业第一第二名合并
  •   结果众人调查一番,非但知道了对方在国外业界的辉煌战绩,还知道了对方是兴业的太子爷……  他带过来的人,只要不傻都会给三分薄面。愚以为宫中之事,事无大小,悉以
  • - 第二回合 找出最会剑玉的观众- 我前面的姑娘站起来挥手让门把选她zin桑:你真会吗?颁奖环节- Iwasho在被女鬼整蛊的那个画面获得了第一名,zin桑负责
  • (感谢图片作者:高佳唐大妞)#人生微语#“春分的杭州是古藤老树昏鸦的”出门前 遇到一只噬元兽堵路 但我没有吃的可以给它 但比起上次来它对我爱答不理 这次主动了许
  • 我最大的恶就是不愿意当奴,前番那头没啥德行的倔强矮驴替人叫屈,堂而皇之对我一阵指摘,大抵内容就是我暴虐,残酷,不宽容,个性强,心眼子多,如何如何如何,说道激动处
  • 配电变压器几乎全部出口,主要销往中南美洲、东南亚等国家,去年有少部分产品进入北美市场,今年1月及近期伊戈尔派了销售团队到北美参加相关展会,北美市场配电变压器的需
  • 当时关注你的时候,粉丝是400多w,现在都800多w了,宝宝被越来越多的人喜欢啦,宇宙巡演也会很快就有的吧[笑哈哈]偶像带来的情绪价值是任何东西无法替代的,她比
  • ——苏轼《行香子·过七里濑》12.日照虹霓似,天清风雨闻。——张孝祥《水调歌头·泛湘江》3.一卮芳酒,一襟清泪,寂寞西窗雨。
  • 北海道パワーで充電させる「都会で充電ツアー」を今年も決行!そして札幌出身のマジシャンが凄技おもてなし#大泉洋#おはようございます。
  • ” “他也在H市?”于一凡的眉头轻轻的拢了起来,“你怎么知道的?" 看来靳迟钧这段时间和裴珩以及于一凡都没有什么联系,因为裴恒和于一凡都不知道他在H
  • ”——假使没有金庸先生的一幅对联,我们七零后的青春不知道会黯淡多少,悠悠历史,侠义江湖,凄美爱情,善良邪恶,绝世武功,万般人生犹如水墨动画呈现在我们眼前,无法忘
  • #这是我无厘头记录的日常# 这还是我第一次自己操作抓娃娃机虽然想抓绿肥肥投了好几个币没抓上来怒而转移目标一次成功(猩猩捶胸尖叫在藤蔓间旋转跳跃)中午喝了一大杯霸
  • 我以为提前半小时喝黑咖出发前就能拉结果就是出发前蹲了几分钟 毫无感觉 劝退今天主页的每日语录背景的幼版馒头罐头诶路上看到三轮车后座里的法斗 好搞笑啊哈哈为什么我
  • 福德高的人可以选择历劫时带什么天赋技能和多少福报,有经验的带够用的就好,没经验的可能全带下来,因为要洗掉过去的记忆,也许就在财官幻境中迷失给浪费了。统一讲福报是