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

news2024/11/19 3:32:07

明确场景

要回答这个问题,我们一般分几步来走:

1.确认问题,对齐Sql语句;

2.解答问题本身,也就是时间复杂度分析;

3.针对本身提出这个场景,可能出现的性能瓶颈进行分析;

4.针对瓶颈,提出多种优化手段。

接下来我们就按照这个思路来一步步深入。

对齐Sql语句

通常而言,面试官抛出一个问题,不见得就是一个非常完善、非常准确的描述,他其实是希望你能提出问题,通过沟通对齐,这也是工作中必备的能力。

首先问面试官,目前表的结构大概是怎样,索引的建设,又是怎样的,假设通过沟通,我们得到如下简化过的表t_player:

只在score字段上建了二级索引,大小是从小到大。这里要找第k个,其实就是偏移k-1:

select * from t_player order by 

时间复杂度分析

这个问题的核心就是查找语句的时间复杂度是多少?

这道题实际是有一定引导性的,故意说索引,就是想让你往树分支上引,我们都知道,走索引,按数值本身查找一个数据,那二级索引的时间复杂度,肯定是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

使用这种模式,可以利用树索引直接找到目标,也绕过了无效回表问题,在Offset超过一万的情况下,性能通常都能提高两个量级以上。

当然,这种适合给分页做优化,如果回到我们题目本身来说,那查找第k大的数,就需要循环“下一页”下去,损耗反而更大。

2.硬碰硬

上面分析了,对无用数据还回表查询,导致大量随机IO,是性能的核心瓶颈,那我们对症下药,能否不回表呢?

当然可以,我们可以进行索引覆盖。

索引覆盖是说当二级索引查询的数据都在二级索引本身,比如索引Key或主键ID,那么就不必再去查聚簇索引。

那你可能会问,在我们的场景,还有其它需要查询的信息,比如名字,并不在二级索引上啊。

是的,但我们可以通过sql的拆分,来达到目的,思路如下:

select * from t_player id in 

这句话是说,先从条件查询中,查找数据对应的数据库唯一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分层架构,及对开源社区的关注。

如果你只是背八股文,而不去深入探索其中的原理,那面试官随便问几个问题,就能看出你其实基础是不扎实的。

这里不是说八股文不好,而是不能觉得面试就是考八股文,这其实是一个很大的误区。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/106992.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue+element模仿腾讯视频电影网站

一.布局设计 官方图例: demo效果: 顶部1;左侧菜单栏2;右侧内容展示区3; 关键点: 顶部固定,不随页面滚动而滚动;左侧可局部滚动显示更多菜单;右侧局部滚动&#xff…

拓扑梅尔智慧办公平台(Topomel Box) 3.0发布

今天,2022年12月21日,我很高兴地宣布:拓扑梅尔智慧办公平台(Topomel Box)的3.0版本正式发布。 下面,请允许我简单地介绍下新版本的一些基本情况。 新特性 1) 统一的文件管理 将所有你关心的文件都统一存放在同一个地方&#xff…

Linux 4.7内核syncookie的性能

虽然现在的内核都已经是4.11版本了,但本文依旧基于较老的内核版本旧事重提,就4.7版本的一个针对syncookie的一个优化书写一段吹捧与嘲讽。 自从4.4版本的Lockless TCP listener以来,针对TCP在大并发连接处理这块一直都没有更大的突破&#x…

RNA-seq 详细教程:注释(15)

学习内容 了解可用的基因组注释数据库和存储信息的不同类型比较和对比可用于基因组注释数据库的工具应用各种 R 包检索基因组注释基因组注释 对二代测序结果的分析需要将基因、转录本、蛋白质等与功能或调控信息相关联。为了对基因列表进行功能分析,我们通常需要获得…

哈希冲突概率计算及python仿真

目录 1. 前言 2. 生日问题 3. 哈希冲突问题 4. 简易python仿真 5. 从另一个角度看哈希冲突概率 1. 前言 Hash函数不是计算理论的中基本概念,计算理论中只有单向函数的说法。所谓的单向函数,是一个复杂的定义,严格的定义要参考理论或者密…

老板,明年我用Seata搞定分布式事务管理的规范化建设 | 中篇

辞旧迎新,22年要结束了,明年做什么想好了嘛?要不要用 Seata 搞定公司分布式事务管理的规范化建设? 欢迎关注微信公众号「架构染色」交流和学习 一、背景 在上一篇《明年用Seata搞定分布式事务管理的规范化建设 | 上篇》 中介绍了…

低成本、高效率!华为云桌面助力企业数字化转型

在云计算飞速发展的今天,传统办公设备体积大、能耗高、维护难、更新换代快等问题日益凸显,而基于云计算平台的虚拟办公系统逐渐被业界接受并得到广泛应用。其中,华为云桌面Workspace既满足了企业移动办公、远程办公、安全办公等要求&#xff…

恒业微晶冲刺创业板上市:计划募资8亿元,戴联平为实控人

12月20日,上海恒业微晶材料科技股份有限公司(下称“恒业微晶”)在深圳证券交易所创业板递交招股书。本次冲刺创业板上市,恒业微晶计划募资8亿元,将用于恒业新型分子筛项目。 据天眼查信息显示,恒业微晶成立…

Servlet中Cookie和Session技术

一、状态管理1.1 现有问题HTTP协议是无状态的,不能保存每次提交的信息如果用户发来一个新的请求,服务器无法知道它是否与上次的请求有联系对于那些需要多次提交数据才能完成的Web操作,比如登录来说,就有问题了。1.2 概念将浏览器与…

牛津大学最新 | LUMix:Mixup改进版,几行代码轻松涨点!

点击下方卡片,关注“自动驾驶之心”公众号ADAS巨卷干货,即可获取点击进入→自动驾驶之心【目标检测】技术交流群后台回复【LUMix】获取论文!!!摘要当使用噪声样本和正则化技术进行训练时,现代深度网络可以更…

云端数据“上榜”了!

背景介绍随着全球特别是北美地区VNF网络应用渐渐地往云上迁移,云环境中更高的性能需求变得越来越迫切。作为一流数据处理中心部门,随着大势所趋,不仅仅专研于裸机的性能数据,也开始关注Intel平台在不同云环境中的性能表现。在DPDK…

外汇天眼:日本央行突然上调收益率目标上限,日元10分钟内涨超2%

12 月 20 日,日本央行公布利率决议,并在货币政策会议上宣布堪称“黑天鹅事件”的重大政策转变。日本央行意外地调整了收益率曲线控制计划,宣布将收益率目标上限从 0.25% 上调至 0.5% 左右,同时又将 1 至 3 月日本国债购买规模提高…

Java当中多态的理解

1. 什么是多态 同一操作,作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。 对应到 Java 里就是针对同一个类型的对象,执行同一个方法,会表现出不同的行为。 简单点说: 就是用基类…

<Linux进程信号>——《Linux》

本节重点: 1. 掌握Linux信号的基本概念 2. 掌握信号产生的一般方式 3. 理解信号递达和阻塞的概念,原理。 4. 掌握信号捕捉的一般方式。 5. 重新了解可重入函数的概念。 6. 了解竞态条件的情景和处理方式 7. 了解SIGCHLD信号, 重新编写信号处理…

面试官:Docker 有几种网络模式?5 年工作经验都表示答不上来。。

docker容器网络 Docker在安装后自动提供3种网络,可以使用docker network ls命令查看 [rootlocalhost ~]# docker network ls NETWORK ID NAME DRIVER SCOPE cd97bb997b84 bridge bridge l…

第1章 概述

第一章 概述 考试范围: 1.1-1.10 考试内容: 章节后的Review Terms(名词基本都在课文中) 考试题型: 综合题 Review Terms Database-management system (DBMS) :A collection of interrelated data and a …

信息检索 Information Retrieval

信息检索主要是查找与用户查询相关的文档。 给定:大型静态文档集合 和信息需求(基于关键字的查询) 任务:查找所有且仅与查询相关的文档 典型的 IR 系统: • 搜索一组摘要 • 搜索报纸文章 • 图书馆搜索 • 搜索网络 …

毕业后,我已经离开机械行业转行码农一年多了......

背景 鄙人本科毕业两年有余,机械工程专业,我已经离开机械行业转行码农一年多了。 如果有正在学习的,退学还是千万不要,不过能换专业就换专业,不能换就往机电一体化靠,加上自学编程,以后做嵌入…

计算机毕设Python+Vue野生动物保护资讯管理系统(程序+LW+部署)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

STM32的ST-link调试下载

调试原理 STM32F-10X使用M3内核,该内核支持复杂的同i傲视操作,硬件调试模块允许在取指令(指令单步运行)或访问数据(数据断电时)使得内核停止。在内核停止时,内核状态都可被查询,完成…