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

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

  明确场景
  要回答这个问题,我们一般分几步来走:
  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分层架构,及对开源社区的关注。
  如果你只是背八股文,而不去深入探索其中的原理,那面试官随便问几个问题,就能看出你其实基础是不扎实的。
  这里不是说八股文不好,而是不能觉得面试就是考八股文,这其实是一个很大的误区。

如何正确的使用一条SQL删除重复数据头条创作挑战赛数据库中表存在重复数据,需要清理重复数据,清理后保留其中一条的情况是比较常见的需求,如何通过1条SQL准确的删除数据呢?1。创建表及测试数据1。1数据库中创建一张测试潍坊青州跑出发展加速度,冲刺首季开门红2月14日一大早,在潍坊雷腾动力机械有限公司的生产车间里,2条生产线全部启动,70多名工人正在生产一批来自巴西的订单产品,这是潍坊青州何官镇工业企业全力以赴冲刺开门红的一个缩影。春科创大数据供应商六棱镜上市公司知识产权诉讼专利无效宣告披露率不足四分之一21世纪经济报道记者董鹏成都报道2月15日,国家专利导航数字化服务基础设施建设成果发布和战略发展研讨会在京召开。会上,六棱镜数字科创研究院发布了从IP到IPO中国专精特新企业的资本DLSSTweaks带来工具为支持DLSS的游戏启用DLAA,让画面更加精致IT之家2月15日消息,YouTube频道MxBenchmarkPC在最新一期对比视频中,为赛博朋克2077游戏安装了来自于DLSSTweaks的DLAAMod,进一步改善了画面质忒修斯(中)破解米诺斯迷宫的王储,消灭牛头人身的怪物古希腊英雄忒修斯是一个半神,传说他有两个父亲,一个是海神波塞冬,一个是雅典国王埃勾斯。在前往雅典的路上,忒修斯将自己的神力展现的淋漓尽致,他一路处决了六个穷凶极恶的强盗,人们把它称7万人共同目睹圣母显现,究竟是集体幻觉,还是神迹降临?天主教中圣母是上帝特别为诞生耶稣而派到人间的圣人,传说见到圣母就能够受到圣母的庇佑。受到无宗教信仰的影响,我们都不相信能够真的见到圣母。但在西方国家却一直流传着圣母现世的传闻,而这法国刽子手家族历史迷雾中的巴黎先生1664年,法国刽子手路易斯德莫斯特的父亲去世,他年仅10岁,刽子手的头衔传给了他。在年轻的路易斯身上,这是一种天职。他的母亲属于著名的纪尧姆家族,这个家族的刽子手在巴黎执行死刑长高端无力,长安难安文丨刘超出品丨牛刀财经(niudaocaijing)长安汽车定下了2023年销售280万辆车的目标,这一目标实现起来并不容易。尽管2022年长安汽车销量创出近5年新高,但也面临诸多西安一市民在京东自营店买痛贴灵收到空盒,两次补发却都不够数第三次补发的痛贴灵在路上了,这一次蒋先生希望不缺少东西。西安市民蒋先生2月9日在仁和智能健康京东自营旗舰店下单了三件不同种类的膏药,其中一件名为痛贴灵。快递包裹从西安嘉浩接货仓分拣泰国旅游局2023年印度游客目标上调至200万据泰媒2月14日消息,泰国国家旅游局局长育他萨透露,日前,印度宣布取消对来自泰国中国日本韩国等地旅客的出发前新冠检测要求,这意味着印度游客人数的复苏速度可能会比预计的更快,可能将达想在印度复刻中国制造,苹果公司困难重重来源环球时报环球时报特约记者甄翔苹果公司想在印度复刻中国制造,却被爆料遇到不少障碍。英国金融时报14日报道称,美国科技巨头苹果将供应链转向印度的努力正在当地遭遇困难。金融时报援引4
天大的事情,也看得不足一笑现在让我有机会谈到一般人对于李白所感到的豪气。豪气是什么呢?就是一种居高临下的态度,用一句成语说,就是以大观小,李白是颇有的。我们从他的作品以接近他的精神,觉得他处处有涌溢而出之势如何看待渐行渐远的友情幼儿园时期的友情幼儿园时期的友情应该是最简单,最纯粹的友情吧,一起搭积木,一起玩泥巴,咿咿呀呀,懵懵懂懂。可能是已长大,距离幼儿园已经很远很远,很难记起幼儿园时期有哪些不开心的事情中秋赏月山西这些地方值得一去捧一壶清茶,拿一块月饼,寻一处美景,赏月聊天,何等惬意!中秋时节,花好月圆,去哪赏月最好呢?如果你对山西稍有了解,就一定知道珏山。双峰拱秀捧婵娟,美景从来稀罕。摘自西江月的这句词,被资本雪藏,被刘嘉玲表白和赵露思两个人狂撒糖的吴磊为什么会红为何在圈里一向以暴脾气著称的吴京会撇下正在向自己提问问题的记者直奔吴磊叫儿子呢?在筹备拍摄我和我的父辈这部电影时候,吴京一直想在一众手破皮都要哭的男演员里找出一个有耐力能吃苦的青年哈勃太空望远镜发现两个重叠的螺旋星系在哈勃太空望远镜拍摄的一张绚丽图片中,有两个重叠的螺旋星系。这两个星系距离地球超过10亿光年,它们的名字是SDSSJ115331和LEDA2073461。尽管它们在这张图片中似乎发正面与苹果对抗,华为Mate50新机遭遇网友嘲讽,没有5G纯属无奈作为国内认可度最高的高端手机品牌,华为可以说是全村的希望,虽然华为Mate50系列有很多硬件的缺陷,但也没有必要因为这个就去嘲讽它。今年对华为来说是非常重要的一年,对华为用户来说也戈尔巴乔夫已死,中苏恩怨已了,中俄携手是大势所趋戈尔巴乔夫死了。普京深切悼念。但又不参加他的葬礼。真是复杂的心情啊。所谓盖棺定论,其实戈尔巴乔夫还没进棺材,他的结论基本也就定了,因为他在三十年前就已经死了。至少,在三十年后的今天1946年戴笠飞机失事,儿子被枪毙,貌美儿媳被蒋介石带到台湾回顾我国五千年以来的历史,身为华夏子孙的我们有自豪也有屈辱。而说起屈辱,那便是近代西方列强对我国的侵占和欺辱。在那段充满屈辱的时期,西方列强用他们的坚船利炮强行打开了我国的国门,肆曹操为什么宁死也要杀华佗?翻开汉书才发现原因,不杀才怪中国历史上有许多名医,他们因为自己高明的医术,被后人所铭记。在诸多的名医中,华佗无疑是名气最大的一个,同样也是最为神秘的一个。作为历史上真实存在的神医,华佗的故事人们都非常熟悉,然83年接到举报一老人总在晚上烧东西,公安调取档案下令立即抓捕1983年4月4日的晚上,人们打开收音机和电视机,发现正在插播一条重要的新闻北京市公安机关经过长期侦查,一举破获国民党潜伏特务李家琪案。而在第二天,北京以及全国各大报纸的头版相继发iOS16正式版下周推送!新功能抢先看,国产系统可有一战之力?面对即将在9月8日发布的iPhone14,各位果粉们都准备好入手了么?也许觉得标准版升级力度不够大,或者认为Pro版价格偏贵的果粉没有换机打算,但等一波iOS16还是非常有必要的。