查看原文
其他

作业帮面试,体感拉满,难度适中。

沉默王二 沉默王二
2024-09-05

大家好,我是二哥呀。

进入 9 月份,秋招正式批算是进入高峰期了,这个阶段很考验人的综合素质,不管是技术实力、面试表现,还是心理抗压,都会进入一个白热化的阶段。

我也会结合星球嘉宾的《面渣逆袭》给大家多分享一些面经八股,好让大家在冲刺的过程中更加得心应手,效率也会更高一些。

今天给大家分享的是《作业帮》同学 1 的一面面经。作业帮成立于 2015 年,是数字教育的开拓者,全球独角兽企业 500 强,看准网上显示上班时间为上午 10 点到下午 7 点,弹性工作,目前参保人数 1664 名。

让天下所有的面渣都能逆袭

整体的面试难度适中,同学 1 给的反馈是面试官人超级好,会给提示,并且还会很认真地对一些特定问题进行探讨。

说实话,遇到这样的面试官,真的是幸运,对作业帮感兴趣的小伙伴可以直接冲了。

作业帮同学 1 一面面经

mysql中如何定位慢查询

排查 SQL 效率主要通过两种手段:

  • 慢查询日志:开启 MySQL 慢查询日志,再通过一些工具比如 mysqldumpslow 去分析对应的慢查询日志,找出问题的根源。
  • 服务监控:可以在业务的基建中加入对慢 SQL 的监控,常见的方案有字节码插桩、连接池扩展、ORM 框架过程,对服务运行中的慢 SQL 进行监控和告警。

也可以使用 show processlist; 查看当前正在执行的 SQL 语句,找出执行时间较长的 SQL。

找到对应的慢 SQL 后,使用 EXPLAIN 命令查看 MySQL 是如何执行 SQL 语句的,再根据执行计划对 SQL 进行优化。

EXPLAIN SELECT * FROM your_table WHERE conditions;

key-len和key没什么区别,什么时候会用到key-len

⑥、key 列:实际使用的索引。如果为 NULL,则没有使用索引。

⑦、key_len 列:MySQL 决定使用的索引长度(以字节为单位)。当表有多个索引可用时,key_len 字段可以帮助识别哪个索引最有效。通常情况下,更短的 key_len 意味着数据库在比较键值时需要处理更少的数据。

你还会查看explain中的哪些字段

三分恶面渣逆袭:EXPLAIN

②、select_type 列:查询的类型。常见的类型有:

  • SIMPLE:简单查询,不包含子查询或者 UNION 查询。
  • PRIMARY:查询中如果包含子查询,则最外层查询被标记为 PRIMARY。
  • SUBQUERY:子查询。
  • DERIVED:派生表的 SELECT,FROM 子句的子查询。

④、type 列:表示 MySQL 在表中找到所需行的方式,性能从最优到最差分别为:system > const > eq_ref > ref > range > index > ALL。

  • system,表只有一行,一般是系统表,往往不需要进行磁盘 IO,速度非常快
  • const、eq_ref、ref:这些类型表示 MySQL 可以使用索引来查找单个行,其中 const 是最优的,表示查询最多返回一行。
  • range:只检索给定范围的行,使用索引来检索。在where语句中使用 bettween...and<><=in 等条件查询 type 都是 range
  • index:遍历索引树读取。
  • ALL:全表扫描,效率最低。

extra有哪些类型

  • Using index:表示只利用了索引。
  • Using where:表示使用了 WHERE 过滤。
  • Using temporary :表示使用了临时表来存储中间结果。

mysql的聚簇索引是什么

在 MySQL 的 InnoDB 存储引擎中,主键就是聚簇索引。聚簇索引不是一种新的索引,而是一种数据存储方式

三分恶面渣逆袭:聚簇索引和非聚簇索引

在聚簇索引中,表中的行是按照键值(索引)的顺序存储的。这意味着表中的实际数据行和键值之间存在物理排序的关系。因此,每个表只能有一个聚簇索引。

普通索引的叶子节点存储的是什么

非聚簇索引:它的叶子节点只包含一个主键值,通过非聚簇索引查找记录要先找到主键,然后通过主键再到聚簇索引中找到对应的记录行,这个过程被称为回表。

代码敲上天.非聚簇索引,以 age 为索引

了解覆盖索引吗

覆盖索引(Covering Index)是数据库索引优化中的一个重要概念,它指的是一种索引能够“覆盖”查询中所涉及的所有列,换句话说,查询所需的数据全部都可以从索引中直接获取,而无需访问数据表的行数据(也就是无需回表)。

通常情况下,索引中只包含表的某些字段,数据库在通过索引查找到满足条件的记录后,还需要回到表中获取其它字段的数据,这个过程叫做“回表”。

假设有一张用户表 users,包含以下字段:id、name、email、age。执行下面的查询:

SELECT age, email FROM users WHERE name = "张三";

如果在 name 列上创建了索引,但没有在 age 和 email 列上创建索引,那么数据库引擎会:

  1. 使用 name 列的索引查找到满足条件的记录的 id。
  2. 根据 id 回表查询 age 和 email 字段的数据。

如果创建了一个覆盖索引 idx_users_name_email_age 包含 name、email、age 列:

CREATE INDEX idx_users_name_email_age ON users (age, name, email);

那么执行:

SELECT age, email FROM users WHERE name = "张三";

查询时可以直接从索引中获取 age 和 email 的值,而不需要回表。这是因为索引已经覆盖了查询所需的所有字段。

三分恶面渣逆袭:覆盖索引

innodb底层有哪些数据结构

B+树索引:最常见的索引类型,一种将索引值按照一定的算法,存入一个树形的数据结构中(二叉树),每次查询都从树的根节点开始,一次遍历叶子节点,找到对应的值。查询效率是 O(logN)。

也是 InnoDB 存储引擎的默认索引类型

B+ 树是 B 树的升级版,B+ 树中的非叶子节点都不存储数据,只存储索引。叶子节点中存储了所有的数据,并且构成了一个从小到大的有序双向链表,使得在完成一次树的遍历定位到范围查询的起点后,可以直接通过叶子节点间的指针顺序访问整个查询范围内的所有记录,而无需对树进行多次遍历。这在处理大范围的查询时特别高效。

一颗剽悍的种子:B+树的结构

②、Hash 索引:基于哈希表的索引,查询效率可以达到 O(1),但是只适合 = 和 in 查询,不适合范围查询。

Hash 索引在原理上和 Java 中的 HashMap 类似,当发生哈希冲突的时候也是通过拉链法来解决。

业余码农:哈希索引

B+树有哪些优点

①、更高的查询效率

B+树的所有值(数据记录或指向数据记录的指针)都存在于叶子节点,并且叶子节点之间通过指针连接,形成一个有序链表。

极客时间:B+树

这种结构使得 B+树非常适合进行范围查询——一旦到达了范围的开始位置,接下来的元素可以通过遍历叶子节点的链表顺序访问,而不需要回到树的上层。如 SQL 中的 ORDER BY 和 BETWEEN 查询。

②、更高的空间利用率

在 B+树中,非叶子节点不存储数据,只存储键值,这意味着非叶子节点可以拥有更多的键,从而有更多的分叉。

为什么不用hash索引

  • B+ 树索引可以进行范围查询,Hash 索引不能。
  • B+ 树索引支持联合索引的最左侧原则,Hash 索引不支持。
  • B+ 树索引支持 order by 排序,Hash 索引不支持。
  • Hash 索引在等值查询上比 B+ 树索引效率更高。
  • B+ 树使用 like 进行模糊查询的时候,LIKE 'abc%' 的话可以起到索引优化的作用,Hash 索引无法进行模糊查询。

redis内存淘汰策略

当 Redis 内存使用达到设置的最大值时(通过 maxmemory 参数设置),它会根据配置的内存淘汰策略来决定如何处理新的写请求。

三分恶面渣逆袭:Redis六种内存溢出控制策略

Redis 提供了以下几种淘汰策略:

  1. noeviction:默认策略,不进行任何数据淘汰,直接返回错误信息。适用于不能丢失数据的场景。
  2. volatile-lru:从设置了过期时间的键中,使用 LRU 算法淘汰最不常用的键。
  3. allkeys-lru:从所有键中,使用 LRU(最近最少使用)算法淘汰最不常用的键。适用于缓存场景,优先保留最近使用的数据。
  4. allkeys-random:从所有键中随机淘汰键。
  5. volatile-random:从设置了过期时间的键中随机淘汰键。
  6. volatile-ttl:从设置了过期时间的键中淘汰即将过期(TTL,Time To Live,存活时间)的键。
  7. allkeys-lfu:对所有的 key 使用 LFU 算法进行删除。
  8. volatile-lfu:对设置了过期时间的 key 使用 LFU 算法进行删除。

redis持久化机制

Redis 支持两种主要的持久化方式:RDB(Redis DataBase)持久化和 AOF(Append Only File)持久化。这两种方式可以单独使用,也可以同时使用。

三分恶面渣逆袭:Redis持久化的两种方式

两种可以混合使用吗

在 Redis 4.0 版本中,混合持久化模式会在 AOF 重写的时候同时生成一份 RDB 快照,然后将这份快照作为 AOF 文件的一部分,最后再附加新的写入命令。

三分恶面渣逆袭:混合持久化

这样,当需要恢复数据时,Redis 先加载 RDB 文件来恢复到快照时刻的状态,然后应用 RDB 之后记录的 AOF 命令来恢复之后的数据更改,既快又可靠。

常用linux命令

我自己常用的 Linux 命令有 top 查看系统资源、ps 查看进程、netstat 查看网络连接、ping 测试网络连通性、find 查找文件、chmod 修改文件权限、kill 终止进程、df 查看磁盘空间、free 查看内存使用、service 启动服务、mkdir 创建目录、rm 删除文件、rmdir 删除目录、cp 复制文件、mv 移动文件、zip 压缩文件、unzip 解压文件等等这些。

用linux命令去查找某个qps

如果服务通过网络提供访问,可以使用 netstat 或 ss 命令统计特定端口的连接数,并结合 watch 命令来监控实时的连接速率。

例如,统计 HTTPS 服务(通常运行在端口 443)每秒的请求数:

watch -n 1 "netstat -an | grep ':443 ' | grep ESTABLISHED | wc -l"

解释一下:

  • netstat -an:显示所有连接和监听端口。
  • grep ':443 ':过滤出端口 443 的连接。
  • grep ESTABLISHED:过滤出已经建立的连接。
  • wc -l:统计连接数。
  • watch -n 1:每秒刷新一次命令的输出。

观察连接数的变化,可以大致估算出每秒的请求数。

二哥的 Java 进阶之路:技术派的 443 请求数

内容来源

  • 星球嘉宾三分恶的面渣逆袭:https://javabetter.cn/sidebar/sanfene/nixi.html
  • 二哥的 Java 进阶之路(GitHub 已有 12000+star):https://javabetter.cn

ending

一个人可以走得很快,但一群人才能走得更远。二哥的编程星球已经有 6100 多名球友加入了,如果你也需要一个良好的学习环境,戳链接 🔗 加入我们吧。这是一个编程学习指南 + Java 项目实战 + LeetCode 刷题的私密圈子,你可以阅读星球专栏、向二哥提问、帮你制定学习计划、和球友一起打卡成长。

两个置顶帖「球友必看」和「知识图谱」里已经沉淀了非常多优质的学习资源,相信能帮助你走的更快、更稳、更远

欢迎点击左下角阅读原文了解二哥的编程星球,这可能是你学习求职路上最有含金量的一次点击。

最后,把二哥的座右铭送给大家:没有什么使我停留——除了目的,纵然岸旁有玫瑰、有绿荫、有宁静的港湾,我是不系之舟。共勉 💪。

个人观点,仅供参考
继续滑动看下一个
沉默王二
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存