• 作者:老汪软件技巧
  • 发表时间:2024-09-07 07:03
  • 浏览量:

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

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

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

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

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

作业帮同学 1 一面面经mysql中如何定位慢查询

排查 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中的哪些字段

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

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

extra有哪些类型mysql的聚簇索引是什么

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

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

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

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

了解覆盖索引吗

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

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

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

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

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

使用 name 列的索引查找到满足条件的记录的 id。根据 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+ 树中的非叶子节点都不存储数据,只存储索引。叶子节点中存储了所有的数据,并且构成了一个从小到大的有序双向链表,使得在完成一次树的遍历定位到范围查询的起点后,可以直接通过叶子节点间的指针顺序访问整个查询范围内的所有记录,而无需对树进行多次遍历。这在处理大范围的查询时特别高效。

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

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

B+树有哪些优点

①、更高的查询效率

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

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

②、更高的空间利用率

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

为什么不用hash索引redis内存淘汰策略

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

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

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

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

两种可以混合使用吗

在 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 命令来监控实时的连接速率。