掌握MySQL高频灵魂面试题,闯入阿里七进七出

博主一学弟在研一六月的时候开始刷 leetcode,在 b 站上看了一个视频把本科学的算法分析给捡起来了,然后花了两个月左右的时间大量刷题,然后参加周赛锻炼,基本上每次都能做出三题,偶尔能做出四题,觉得差不多的时候就只做每日一题了,然后在 B 站上看多线程,网上找了一个烂大街的高并发商城秒杀项目做了做,又凑了一个实验室的垃圾项目包装了一下,项目如下:

掌握MySQL高频灵魂面试题,闯入阿里七进七出_第1张图片

3.12

投递,笔试(1.76/2)

3.14 一面

问题记得不是很全,开始先聊了会天

为什么用 redis

  • 100w qps,10 个商品,打到服务器,怎么减少到服务器的流量
  • redis 数据结构
  • rabbitmq 怎么保证数据不丢
  • 常见排序 时间复杂度 空间复杂度
  • jvm 分代收集
  • 垃圾回收的时候服务不可用
  • 为什么选择 mongodb

3.16 二面

二面是我觉得最刺激的面试(小声 bb:问了很多八股)

  • 介绍项目(高并发,爬虫)
  • 缓存和数据库一致性怎么保证
  • java 在高并发下的内容(主要是问我 CAS)
  • Reentrantlock 的原理(从 AQS 扯下去)
  • 公平锁和非公平锁
  • TCP UDP 底层是什么(答IP)
  • IP 是否可靠(不可靠)
  • TCP 是否可靠,如何保证可靠(跟面试官扯三次握手四次挥手,滑动窗口,拥塞控制,确认机制)
  • 为什么三次握手四次挥手,滑动窗口解决什么问题
  • TCP 最大连接数受什么限制(我说端口数,面试官说不对,然后不知道)
  • NIO(我说不会,但知道 I/O 多路复用技术,跟面试官扯了扯 select/poll/epoll)
  • 数据库隔离级别,解决了哪些问题
  • spring 事务传播机制(我说不会)
  • 看我项目里面有分布式 session,问分布式 session 的实现方式有哪些
  • 强软弱虚引用,区别,用到哪里
  • 分布式事务(不知道)
  • 期间还问了问在校成绩和一些竞赛的情况。

3.17 三面

是个大老板面,主要是聊天,然后围绕项目问了一些生产上的问题,结果当然是答得一般般。三十分钟

3.19 HR面

这个就没什么好说的,常规问题,手里有啥 offer 吗,公司怎么选择啊,还介绍了项目,这是没想到的,二十分钟。

然后就是漫长的等 offer 时间,找了内推人和一面面试官好几次(一面面试官人挺好的),等了整整三个星期才收到意向书,期间收到了美团的offer,要不然这日子是真的难熬。

MySQL灵魂高频面试题

索引相关

1. 什么是索引?

索引是一种数据结构,可以帮助我们快速的进行数据的查找.

2. 索引是个什么样的数据结构呢?

索引的数据结构和具体存储引擎的实现有关, 在MySQL中使用较多的索引有Hash索引,B+树索引等,而我们经常使用的InnoDB存储引擎的默认索引实现为:B+树索引.

3. Hash索引和B+树所有有什么区别或者说优劣呢?

首先要知道Hash索引和B+树索引的底层实现原理:

hash索引底层就是hash表,进行查找时,调用一次hash函数就可以获取到相应的键值,之后进行回表查询获得实际数据.B+树底层实现是多路平衡查找树.对于每一次的查询都是从根节点出发,查找到叶子节点方可以获得所查键值,然后根据查询判断是否需要回表查询数据.

那么可以看出他们有以下的不同:

  • hash索引进行等值查询更快(一般情况下),但是却无法进行范围查询.

因为在hash索引中经过hash函数建立索引之后,索引的顺序与原顺序无法保持一致,不能支持范围查询.而B+树的的所有节点皆遵循(左节点小于父节点,右节点大于父节点,多叉树也类似),天然支持范围.

  • hash索引不支持使用索引进行排序,原理同上.

  • hash索引不支持模糊查询以及多列索引的最左前缀匹配.原理也是因为hash函数的不可预测.AAAA和AAAAB的索引没有相关性.

  • hash索引任何时候都避免不了回表查询数据,而B+树在符合某些条件(聚簇索引,覆盖索引等)的时候可以只通过索引完成查询.

  • hash索引虽然在等值查询上较快,但是不稳定.性能不可预测,当某个键值存在大量重复的时候,发生hash碰撞,此时效率可能极差.而B+树的查询效率比较稳定,对于所有的查询都是从根节点到叶子节点,且树的高度较低.

因此,在大多数情况下,直接选择B+树索引可以获得稳定且较好的查询速度.而不需要使用hash索引.

4.唯一索引比普通索引快吗, 为什么

唯一索引不一定比普通索引快, 还可能慢.

查询时, 在未使用limit 1的情况下, 在匹配到一条数据后, 唯一索引即返回, 普通索引会继续匹配下一条数据, 发现不匹配后返回. 如此看来唯一索引少了一次匹配, 但实际上这个消耗微乎其微.

更新时, 这个情况就比较复杂了. 普通索引将记录放到change buffer中语句就执行完毕了. 而对唯一索引而言, 它必须要校验唯一性, 因此, 必须将数据页读入内存确定没有冲突, 然后才能继续操作. 对于写多读少的情况, 普通索引利用change buffer有效减少了对磁盘的访问次数, 因此普通索引性能要高于唯一索引.

MySQL由哪些部分组成, 分别用来做什么

1.Server

  • 连接器: 管理连接, 权限验证.
  • 分析器: 词法分析, 语法分析.
  • 优化器: 执行计划生成, 索引的选择.
  • 执行器: 操作存储引擎, 返回执行结果.

2.存储引擎: 存储数据, 提供读写接口.

MySQL查询缓存有什么弊端, 应该什么情况下使用, 8.0版本对查询缓存有什么变更.

  • 查询缓存可能会失效非常频繁, 对于一个表, 只要有更新, 该表的全部查询缓存都会被清空. 因此对于频繁更新的表来说, 查询缓存不一定能起到正面效果.
  • 对于读远多于写的表可以考虑使用查询缓存.
  • 8.0版本的查询缓存功能被删了

存储引擎相关

1. MySQL支持哪些存储引擎?

MySQL支持多种存储引擎,比如InnoDB,MyISAM,Memory,Archive等等.在大多数的情况下,直接选择使用InnoDB引擎都是最合适的,InnoDB也是MySQL的默认存储引擎.

InnoDB和MyISAM有什么区别?

  • InnoDB支持事物,而MyISAM不支持事物
  • InnoDB支持行级锁,而MyISAM支持表级锁
  • InnoDB支持MVCC, 而MyISAM不支持
  • InnoDB支持外键,而MyISAM不支持
  • InnoDB不支持全文索引,而MyISAM支持。

MySQL事务的隔离级别, 分别有什么特点

  • 读未提交(RU): 一个事务还没提交时, 它做的变更就能被别的事务看到.
  • 读提交(RC): 一个事务提交之后, 它做的变更才会被其他事务看到.
  • 可重复读(RR): 一个事务执行过程中看到的数据, 总是跟这个事务在启动时看到的数据是一致的. 当然在可重- - 复读隔离级别下, 未提交变更对其他事务也是不可见的.
  • 串行化(S): 对于同一行记录, 读写都会加锁. 当出现读写锁冲突的时候, 后访问的事务必须等前一个事务执行完成才能继续执行.

    掌握MySQL高频灵魂面试题,闯入阿里七进七出_第2张图片

做过哪些MySQL索引相关优化

  • 尽量使用主键查询: 聚簇索引上存储了全部数据, 相比普通索引查询, 减少了回表的消耗.
  • MySQL5.6之后引入了索引下推优化, 通过适当的使用联合索引, 减少回表判断的消耗.
  • 若频繁查询某一列数据, 可以考虑利用覆盖索引避免回表.
  • 联合索引将高频字段放在最左边.

一千万条数据的表, 如何分页查询

数据量过大的情况下, limit offset分页会由于扫描数据太多而越往后查询越慢. 可以配合当前页最后一条ID进行查询, SELECT * FROM T WHERE id > #{ID} LIMIT #{LIMIT}. 当然, 这种情况下ID必须是有序的, 这也是有序ID的好处之一.

总结

阿里的面试体验挺好的,非常快,一面的时候不会的还告诉了答案,就是等的太漫长了,总之要给项目赋能(包装),给面试官打造面试抓手(让面试官有处可问),形成将问题引向自己会的方向的打法。

篇幅有限!篇幅有限!关于缓存架构技术:Redis+MongDB,就聊到这儿啦…啦…啦…

以上博主所介绍的全部相关的笔记资料都已整理成册,手写pdf笔记,想白嫖都很so easy!!

掌握MySQL高频灵魂面试题,闯入阿里七进七出_第3张图片

——如果你get到了,那就点个赞转发支持一波吧!

——祝前程似锦,offer不断,好好学习,天天向上!

你可能感兴趣的:(吐血整理系列,Java面试,Java面试题,java,面试技巧,面试经验,面试题答案,mysql面试题)