专栏文章 千万不要给女朋友解释 什么是 “二叉树算法”

程序员一凡 · 2021年03月08日 · 最后由 程序员一凡 回复于 2021年03月09日 · 4750 次阅读

千万别给自己女朋友以任何方式讲技术,问就是不知道,秘诀~

事情是这样的。

女朋友最近突然爱学习了,各种刷数据库、Linux 方面的题,以前都是没日没夜的追剧,突然有了学习的劲头,着实让我没想到。看似一片欣欣向荣,不过,长期的生存经验告诉我,这并不是什么好事,事出反常必有妖~

但凡有交友经验的兄弟都知道,和女朋友讲技术真是一言难尽,不光看你讲解的临场发挥能力,还要分 N 次考核你对女朋友的耐心程度。

一个零基础小白不追肥皂剧了,开始研究数据库、Linux,弯转的有点急啊,不过,不管怎么样渴望学习是好事。

和当初去小米面试不一样,你要没有扎实的基本功,想忽悠住面试官可太难了。但现在我这点水平忽悠她,那还不跟欺负小学生一样。

今天突然问我:" 什么是 数据库 的二叉树算法?",我有点惊讶,问的挺深入,看来这次是认真学了啊。那得赶紧讲不能打消人家的学习积极性。

于是我清了清嗓子:关于数据库,我认为是软件测试工程师第一个要学的技术也是最重要的基础。不仅你做功能测试要用到数据库;接口测试、很多接口的返回值它是动态的,那么你要去数据库拿数据来校验;还有自动化,怎么去做一些数据驱动,都要从数据库里去拿。你做性能测试是不是也和数据库有关。比如慢查询,都和数据库有关。

打开电脑翻出了当初我面试时候总结的面试题数据库部分:

顺便秀了一下我的面经

所以说,你要去面试软件测试工程师。数据库这一关你得要有底。

她双手托着下巴听得很是仔细。(貌似从她眼中看到了崇拜)

首先如果你要去面试,你得首先保证你掌握了 sql 的基本查询

增删改查

第一部分:软件测试基础理论、流程还有项目管理

增删改查大家基本都会吧,Select、Delete、Update、还有一个子查询、关联查询、分组查询、分组过滤。

子查询:就是一个嵌套在查询语句中的查询

关联查询:内连接、外连接(左连接、右连接)

我相信每次去面试的时候很多人都会去百度。搜索什么是什么子查询?什么是关联、分组查询?什么是分组过滤……经过熬夜看完了几篇 “深度好文” 可能面试官问,也会胸有成竹。

如果以上的内容都不熟悉,就不要在简历中写:“我熟悉数据库的语句”

你可能比较陌生的可能是分组查询 ( group by) 和分组过滤 (having)

分组查询 ( group by) 是一个按照表中一个或者多个字段,将数据进行分组,一般用于数据进行分类汇总。

其实这是个挺简单的概念。

她点了点头,说嗯嗯,这些我都掌握了
“好的,那我们接着来看下面的面试问题,从面试题反推来学习软件测试的技术”

第二部分:数据库

1.说一下你常用的 sql 优化方式?为什么 select* 效率低?

优化方式比如说你用到了 select*,那么我就会问你为什么 select* 效率低?

可能你会说因为 * 是查询所有的。

面试官:那还有呢?还有什么要补充的吗?

我:(抓抓头发,手儿无处安放)面试官,你干脆把简历还给我吧,我都不想再说下去了。

有很多时候是这样子的 ,当面试官问到你一个问题,如果你只知道一点点,你说出来一点点,面试官问你还有没有其他要补充的……

她被我的动作逗笑了

那么 select* 为什么效率低?

第一个你需要根据你理解的原理,具体分析。有时候做测试你会去看一些 Mysql 的书籍,它会告诉你,一律不要用 * 作为查询的字段的列表。

她放开了托着下巴的手,抬头问我:为什么呢?

第一个,不需要的列会增加数据传输时间和网络开销。有些数据库和应用不在一台服务器。

比如我的应用数据库肯定是有一个服务器的,那你的后端前端可能不在同一台服务器上,会有很多网络开销。因为有时候我们在前端的操作都会用到数据库,如果你都用 select* 那么就大大增加了网络开销,它会去解析很多的内容。特别一些 select 语句比较复杂解析比较多的时候,会给数据库造成沉重的负担。

特别有一些大类型的字段,比如有一个叫做 text 、 它是非常大的

varchar(字符串类型)比如还有一些加密的、日之类的字段,增加网络消耗是非常明显的。即使这个 Mysql 服务器和客户端在同一台机器上,使用的协议 tcp 通信也需要额外的时间,所以说这个传输时间和网络开销肯定会加大。

那么对于这些无用的大字段,可能还会增加一些 IO 操作。(如果长度超过一定字节,它会把一些超出的速率数据化到另一个地方,然后再去读取这些记录就会增加一次 IO 操作)

其实还有一个非常重要的点,Mysql 有一个概念:覆盖索引(业界极为推崇的查询优化方式)

如果你用到了 select*,你将失去 Mysql 优化器覆盖索引策略优化的可能性。

奥,原来如此,懂了懂了……懂得还挺多嘛~
(此时,心中暗喜,虽然经常被夸,但对于技术这一块,我拿捏得死死的,夸到终点了)

那我们接下来看什么是索引?索引为什么能增加查询效率?

索引是和性能息息相关的一个东西

如果我们把数据库当做一本 “新华字典” 索引就是这个字典的目录。一般会针对 where(id 等于多少)条件后面的字段

索引既然是一个目录,那么它就可以分为很多级。(目录下面又有一个目录)

图中的 id 是一个 int 类型,那么图中的 “钥匙” 代表什么?主键。所以说 id 可能是主键,其他的一些就是字段名称、字段类型、字段的长度

SHON INDEX fromorderl(查询某个表索引语句)

吧啦吧啦半天,给我自己都讲嗨了,我问人家懂了嘛,她来一句:懂了一丢丢,我待会再好好理解一下?

记住一个概念,主键本身就是一种唯一索引。

比如你要去查询 select * from where id=4 id 等于多少,它就用到了一种索引。所以说索引就是这个字典的目录,一般会针对 where 条件后面的字段。

所以说这样去查,如果你不是主键,那么会慢很多,如果你是主键是索引,就会快很多。

此时她明显有点不耐烦了,说了这么多。“那么什么是二叉树算法呢”
“别急别急,马上就讲”

为什么索引能让查询变快?
数据结构

btree:二叉树算法

举个例子:

这个数据库表刚好有 11 行,当我想查询小六,比如说 select * from where id=4 的时候,这个时候如果不加索引。执行这行语句做的什么动作?就是一个一个查下去,查到 4 的时候还会往下查询,查 11 次。

如果一般的有百万级的数据,它就会去查百万次。

如果我们用二叉树算法(索引)它会去查询多少次呢?

二叉树的原理:取中间一个数,大于的右移,小于的左移。每次减半。

11 个数据,二叉树的一个经典的算法,取中间的一个数,11 最中间的一个数是什么?是 6 对吧。那么它会把小于 6 的 12345 放一边,然后这里 7891011 也会放一边,他就会这样去进行。

我们来看一看如果它加了索引,它会查询几次。比如它第一次查 id 等于 4,它会取中间一个数等于 6,我们要的不是等于 6。根据原理,它就又会去取中间一个值,大于的右移,小于的左移 6 的中间值是 3,12 放左边,45 放右边。

那么它可能查三到四次就可以查到了。这就是索引的效率,是不是会快很多?数据量大的时候提高效率可想而知。

我对自己的表现,很满意。

然而……

“我就让你给我解释什么是二叉树算法,你给我讲这么多,我要好好消化一下。这个月的饭你来做,衣服碗也一起洗了奥~”

太难了……

大智若愚。

我有女朋友吗

以上故事纯属虚构,如有雷同算你牛批

整理了几百本各类技术电子书,送给小伙伴们。关注公号回复【2021 面试】自行领取。和一些小伙伴们建了一个技术交流群,一起探讨技术、分享技术资料,旨在共同学习进步,如果感兴趣就加入我们吧!

程序员一凡公号首发

共收到 6 条回复 时间 点赞

讲得太好了,给你点个赞,虽然我没看完

有点虎头蛇尾的感觉,前面铺垫的特别好,真正讲二叉树的时候,内容比较少

写的很好,继续。。

Wong 回复

感谢你的赞,虽然我是官方回复😎

大海 回复

你们的每一次点赞,就是对我最大的支持,让我一直坚持的做出更好的内容

stevenxu 回复

确实,我也感觉到了,下次改进。总之感谢!

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册