范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

无效回表谁的锅?存储引擎这事儿不赖我

  明确场景
  要回答这个问题,我们一般分几步来走:
  1.确认问题,对齐Sql语句;
  2.解答问题本身,也就是时间复杂度分析;
  3.针对本身提出这个场景,可能出现的性能瓶颈进行分析;
  4.针对瓶颈,提出多种优化手段。
  接下来我们就按照这个思路来一步步深入。
  对齐Sql语句
  通常而言,面试官抛出一个问题,不见得就是一个非常完善、非常准确的描述,他其实是希望你能提出问题,通过沟通对齐,这也是工作中必备的能力。
  首先问面试官,目前表的结构大概是怎样,索引的建设,又是怎样的,假设通过沟通,我们得到如下简化过的表t_player:
  字段名
  类型
  描述
  id
  bigint(20) unsigned
  主键id
  score
  int(11) unsigned
  分数
  name
  varchar(128)
  姓名
  只在score字段上建了二级索引,大小是从小到大。这里要找第k个,其实就是偏移k-1: select * from t_player order by  score desc offset k - 1 limit 1
  时间复杂度分析
  这个问题的核心就是查找语句的时间复杂度是多少?
  这道题实际是有一定引导性的,故意说索引,就是想让你往树分支上引,我们都知道,走索引,按数值本身查找一个数据,那二级索引的时间复杂度,肯定是O(logN)。
  但这题不一样,是找第k个,比如第100个,我们其实是不知道树的分支结构具体是怎样的,也就是说我们不知道左子树有多少个节点,右子树有多少个节点。
  进一步而言,我们没法确定走哪条路,树的分支结构不可行。
  所以这里其实是考察B+树的理解,B+树除了分支,底层还有一个双链表,直接走双链表查询,反而是更快的了。
  时间复杂读O(N),我们反过来想,其实这道题就是考你B+树数据结构,如果直接问你B+树结构,大多数有准备的同学,都能回答清楚,但是通过一个实际问题来问你,只有真正理解其作用,才能快速答出。
  这就完了吗?当然没有,这只是一个起手式,下一步,面试官肯定会问你这个操作的性能如何,当然你也可以主动谈起。
  offet慢问题
  如果offset大于10000,这个数据查询就会非常的慢。为什么会慢呢,一般都会答因为遍历,时间复杂度是O(N)。
  但实际如果你测试一下,你会发现这条语句会慢得离谱,这绝不是所谓遍历能导致的。
  更深层次的原因在于,对于前10000个不需要的数据,MySQL每次也要回表去查找,这就导致了10000次随机IO,当然慢成狗。
  优化方案
  如果有开发经验的同学,会很容易想到从业务形态上去优化,这里就不卖关子了,这种场景通常有三种解决方案。
  1.业务上绕过
  将limit、offset,改为next,也就是将第x页,改为下一页,这样就
  可以通过树分支查找。
  举个例子,百度的搜索界面,就是典型的分页面。
  而现在移动互联网时代,用得更多的就是上一页、下一页这样的翻页逻辑,微博、抖音都是这样的逻辑。 --- 记录score为prev_score select score from t_player order by  score desc limit 20 --- 记录score为prev_score select score from t_player where  score < prev_score order by score  desc limit 20
  使用这种模式,可以利用树索引直接找到目标,也绕过了无效回表问题,在Offset超过一万的情况下,性能通常都能提高两个量级以上。
  当然,这种适合给分页做优化,如果回到我们题目本身来说,那查找第k大的数,就需要循环"下一页"下去,损耗反而更大。
  2.硬碰硬
  上面分析了,对无用数据还回表查询,导致大量随机IO,是性能的核心瓶颈,那我们对症下药,能否不回表呢?
  当然可以,我们可以进行索引覆盖。
  索引覆盖是说当二级索引查询的数据都在二级索引本身,比如索引Key或主键ID,那么就不必再去查聚簇索引。
  那你可能会问,在我们的场景,还有其它需要查询的信息,比如名字,并不在二级索引上啊。
  是的,但我们可以通过sql的拆分,来达到目的,思路如下: select * from t_player id in  (select id from t_player order by  score offset 10000 limit 1)
  这句话是说,先从条件查询中,查找数据对应的数据库唯一id值,因为主键在辅助索引上就有,所以不用回归到聚簇索引的磁盘上拉取。
  如此以来,offset部分均不需要去反查聚蔟索引,只有limit出来的10个主键id会去查询聚簇索引,这样只会1次IO。
  在业务确实需要用分页的情况下,使用该方案可以大幅度提高性能,通常能满足性能要求。
  有同学可能担心本身走B+树的双指针会是瓶颈,牛哥也做了测试:
  一张500w的表,offset 10000,要是没索引覆盖,处理时间甚至可以达到十秒级,有了的话,能降低到十毫秒级,有质的飞跃。
  ps:具体时耗和数据库性能等因素有关,以上数据只是参考。
  3.预判边界值
  这其实也是根据业务场景的做法,能通过业务预判边界,这种方式并不是通用解决方案,但因为《高性能MySQL》中提到了,也一并列出来。
  深层次灵魂发问
  为什么MySQL不直接丢掉无用数据,还要傻乎乎地回表?
  也许你曾经听过一个词,叫索引下推,在MySQL5.6之后,MySQL通过索引下推提升了性能。
  这个问题也类似,答案是Offset未曾下推! 我们先review下查找流程:
  1.存储引擎通过二级索引查找,获取主键值;
  2.进行回表操作,将完整记录返回给上层;
  3.上层判断是否需要该记录,需要则返回给客户端,不需要则跳过该记录;
  4.存储引擎接着查找下一条;
  5.重复第二步。
  从流程其实我们能看出,存储引擎层是没有Offset信息的。
  牛哥和咱们训练营导师虎哥也讨论过这个问题,虎哥的解释还是比较到位的:
  MySQL不做的原因,无非两点:
  1.限制场景太多,给多个引擎做有点得不偿失;
  2.更核心的,分层设计理念,这件事本身是Sql层的,本就不该存储引擎做。
  野生db
  那我们现在来看看所谓的野生db的情况:
  野生db1号:阿里云
  野生db 2号:腾讯云
  另外,腾讯云还描述了适用场景:
  下推之后阿里云测试了性能,Q3即我们二级索引order by ... limit回表的场景,可以看到从25s降低到了329ms左右,相差75.82倍。
  可以发现阿里腾讯两大云厂商MySQL自研版本都做了下推,那MySQL从技术上自然也能。
  有大佬针对这个问题还给MySQL提了bug。 https://bugs.mysql.com/bug.php?id=109173
  还带了修复方案:
  https://bugs.mysql.com/file.php?id=31884&bug_id=109173
  当然mysql有自己的设计理念和坚持,可能以后也不会采纳。
  而将阿里云、腾讯云这些称为野生db,其实也只是调侃的说法。
  实际上他们都遵循实用原则,是非常优秀的团队,自研产品的决策灵活性本身也更高一些。
  这倒不是非要分个孰优孰劣,大家搞清楚前因后果即可。
  补丁分析
  虽然我们已经将前因后果弄得很清楚,但相信还是会有同学好奇,上面的大佬做的补丁,到底是怎样的。牛哥和虎哥,也做了一些分析。
  核心要素就是在引擎层增加了这么一个函数,可以下推索引。
  这个函数有几层,最核心的其实在这里:
  其实就是offset判断,如果offset比现在的遍历偏移还大,就跳过。
  Sql层会调用引擎层这个函数,当然调用之前会有个判断。
  很复杂是吧,没事,咱们看注解:
  其实就是限制了很多情况,比如group by,having这种推了也不顶用的,就不推了。
  Review一下
  可以看到,看起来很简单的一个问题,其实牵涉到的知识很广:
  首先时间复杂度是多少?考察B+树结构;
  Offset为什么慢?考察对底层行为一定程度的掌握;
  几种解决方案?考察技术视野和解决问题的能力;
  深层次行为原因?考察MySQL分层架构,及对开源社区的关注。
  如果你只是背八股文,而不去深入探索其中的原理,那面试官随便问几个问题,就能看出你其实基础是不扎实的。
  这里不是说八股文不好,而是不能觉得面试就是考八股文,这其实是一个很大的误区。

战争公约王牌使命首次测试,你体验了吗?革新军武卡牌手游战争公约王牌使命你可以领略到军武卡牌游戏策略养成的独特魅力!随心搭配阵容养成军武,低卡逆袭只在你决断之间。统领全局指挥军团,与敌人在战争公约的世界里一决胜负,下面带貂蝉加强了!王者荣耀S30赛季解析超多装备调整CNMO1月3日,王者荣耀S30火鹰传奇新赛季正式开启,新赛年奇迹之海也随之而来,这一年的故事将围绕王者世界新的一片区域海都而展开。同时,新英雄火鹰船长莱西奥上线,王者荣耀对野区对经典游戏中玩家舍不得杀的怪物,先将经验值完全榨干再说玩单机游戏最怕遇到的是什么呢?那就是怪物全都杀死了,找不到地方练级了。当年玩火炬之光暗黑破坏神1金庸群侠传时就曾经遇到过这种困扰。火炬之光和暗黑破坏神1中的怪物不会复活,只要被干掉双语美文ACradleSongACradleSong摇篮之歌Sweetdreams,formashade甜蜜的梦筑成一片浓阴,Oermylovelyinfantshead!笼罩着我可爱的幼儿头顶。Sweetdr家长拍孩子虐心视频消遣了什么李英锋家长将孩子悉心照顾的宠物螃蟹煮了,递给孩子一只螃蟹腿,嘴里说着吃不吃,不吃我吃了,孩子一边撕心裂肺地哭,一边接过螃蟹腿,放进嘴里说香。这个画面出自近日流行于某短视频平台的一条为什么孩子总是觉得迷茫?给他一个榜样试试看一个高一的孩子在文章中写到我一直很努力,很认真的读书,也成为了家长们眼中的尖子生和别人家的孩子。但是现在我觉得盲目的听从老师和家长的话,达到他们的要求,我觉得很苦闷,我无法成为真正拯救配菜宝宝正值中午,开饭了,你们看,在一个圆柱体里面,配菜宝宝正在VS头发呢,这是怎么一回事呢?让我来跟你们细细娓娓道来吧。救救我们,超人。那些配菜宝宝们在沼泽里面实在挣扎不住了香肠姐姐黄瓜戚薇产后2个月瘦15斤,做好这些你也行!原创孕事经历了怀胎十月的浇灌,很多妈妈是胖多两人。胖得少的二三十斤,胖得多的五六十斤,胖出一个自己的妈妈也不少,以至于很多妈妈产后最想做的事就是赶紧瘦!孕事妈也经常能收到粉丝妈妈的当个厚脸皮小孩,真好!分享一个日常小故事。我发现,相对高级点的酒店和餐厅,特别适合锻炼娃的脸皮。服务比较好的酒店和餐厅,只要孩子的需求在合理范围内,服务员一般都会尽可能地满足孩子,孩子也很容易通过服务员产房是个照妖镜,不生一次孩子,你怎么知道嫁的是人是鬼!导语很多年轻人在谈恋爱的时候,特别希望自己的婚后生活可以幸福,一直白头到老,但是步入婚姻之后,生活中的琐碎逐渐多了起来,婚姻生活不和自己谈恋爱时候一样,因为步入婚姻之后就证明你成年进入女性体内,没和卵子相遇的小蝌蚪去哪了?答案非常有意思相信每个孩子都问过父母这样的问题我究竟是怎么来的,而父母们的回答也各有不一,有的会说从垃圾桶捡来的,有的会说石头缝里蹦出来的。可是,随着孩子们年龄不断增长,对这样的问题也慢慢有了了
辽篮王朝桎梏之郭士强和张庆鹏有你没我图郭艾伦在与新疆的比赛中突破上篮辽宁男篮是CBA历史上一支传统豪强,这点没有人否认!但要问辽宁男篮是一支成功的球队,不知道有几人赞同?虽然辽宁在历史上多次闯入总决赛,但是遗憾的是,86岁老人驰骋球场79年踢过1600多场比赛据英国镜报12月9日报道,现年86岁的DickieBorthwick已经踢了1600多场比赛,进了大约400个球,或已成为英国最年长的业余足球运动员。当Dickie还是个小男孩时就杨超越16岁辍学,20岁走红,我看到了打工人的悲哀在一期节目中,吴昕好奇地问杨超越。你左手食指怎么了?是有点变形吗?杨超越面不改色地说道在拉链厂的流水线上,不小心把手指放到机器里了。这句话一出,坐在对面的吴昕,直接吓得起鸡皮疙瘩!冯小刚身价几十亿,却患有白癜风病情严重,徐帆痛哭称放弃治疗大家都知道,冯小刚有非常严重的白癜风。但是近期有媒体爆料,冯小刚的白癜风治不好了。而且为了治疗,冯小刚走遍天下寻遍名医。可还是无果。并且病情还在持续恶化。冯小刚是出了名的应酬之王,金立宣布加入华为阵营,发布HMS新机,6256G才卖1059元金立新手机就要面世了,这次金立的概念是用华为的hms应用生态,都知道gms的应用生态不让华为用之后,华为自己研发了hms。华为手机在操作系统上还有鸿蒙,这次金立的ti13准备用华为4消息!北京双外动态,哈里斯欲回归,王潼入浙江,三篮明日开打根据目前的消息,吉布森会在下周的时候回归,也就是说他已经签约北京了。不过就吉布森这个点来看,上赛季场均为2454的数据,只是球场上有点神经刀。不过一旦找到状态,他就是球场上的霸主,糖尿病人容易出现心脑血管疾病?做好这4件事,或许能预防很多人只知道血糖升高会引发不良症状,却不知道糖尿病不断加重许多并发症会出现,其带来的影响广泛,如果没有时刻提防心脑血管疾病,在血糖升高的时候血管,神经等受到损伤,心脏和大脑健康也会血管外科刁永鹏这一水果可辅助降血脂,5大益处你了解吗?夏方养生指南高脂血症就是指血脂水平太高,可直接产生某些严重危害身体健康的病症,如动脉粥样硬化冠心病胰腺炎等,高脂血症可分成原发性和继发性两大类。高脂血症的病患除去药物降低血脂外,日血管堵,疾病生!别再给自己添堵啦高血脂是隐秘的无声杀手,平时不痛不痒,没有明显症状,很多人都不以为然,但它却是动脉粥样硬化的罪魁祸首!一旦病发,非死即残的病例数不胜数,由此诱发的心脑血管疾病死亡人数,每年远超30如何做温暖的女性?这样吃你也可以女生经常把体寒挂在嘴边比如手脚冰凉来姨妈的时候小肚子又涨又痛夏天还爱吃冷的容易拉肚子今天给大家整理几种食物很适合体寒的女性朋友们第一生姜不是直接吃姜可以选择姜粉平时泡一杯红糖姜茶会西红柿不能随便吃?提醒这3类人,平时尽量少吃,要听劝西红柿又叫番茄,为茄科植物西红柿的新鲜成熟果实,味干酸性微寒,具有生津止渴健胃消食的功效,用于口渴食欲不振。医学专家认为每人每天吃两到三个番茄,就可以满足一天维生素C的需要,喝上几