ITPub博客

首页 > 数据库 > 数据库开发技术 > 大厂面试丨P7程序员如何解答数据库索引?!

大厂面试丨P7程序员如何解答数据库索引?!

原创 数据库开发技术 作者:Finally_m 时间:2021-06-03 18:06:00 0 删除 编辑

点击上方"蓝字"关注

文末送书啦!


相信很多小伙伴在面试时都会经历数据库相关的问题,数据库属于一个应用的最底层,数据库的性能优化,对于应用来说至关重要,数据量小还好说,但请问Java应用中数据量会小到哪里去,尤其现在主流的互联网相关项目,动不动就是TB,大型电商项目甚至是PB级别。

这么大的数据量,从架构到底层数据库,任何一个地方的性能提升都是倍数级的!

如果你去面试遇到面试官扣数据库性能优化,那恭喜你,把握住机会吧!

01

这几个问题你怕不怕?

阿里出题专家近秋同学,是阿里数据库产品技术部技术专家,来瞧瞧他问的几个问题,你是否能答上来呢?

  1. 能说说什么是索引吗?索引的种类有哪些?

  2. 什么情况下适合建索引?

  3. MySQL索引具体采用的哪种数据结构呢?

  4. 你提到InnoDB使用的B+树的索引模型,那么你知道为什么采用B+树吗?这和Hash索引 比较起来有什么优缺点吗?

02

注意面试官的预期

1、了解面试者是否真实做过大数据量检索项目,如何优化

2、了解面试者对技术深度的理解程度

03

这样回答你中不中?

一问:能说说什么是索引吗?索引的种类有哪些?

答:索引(Index)是帮助数据库高效获取数据的数据结构。索引是在基于数据库表创建的,它包含一个表中某些列的值以及记录对应的地址,并且把这些值存储在一个数据结构中。

最常见的就是使用哈希表、B+树作为索引,项目中我们使用InnoDB引擎,默认的是B+树。

二问:什么情况下适合建索引?

答:一般来说,在WHERE和JOIN中出现的列需要建立索引,因为MySQL只对<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE才会使用索引(以通配符%和_开头作查询时,MySQL不会使用索引)。

通常会根据慢查询日志来优化 SQL以及判断是否建索引。

三问:你们在创建索引的时候都会考虑哪些因素呢?

答:在日常工作中,我们会通过开慢查询去记录一些执行时间比较久的SQL语句,我们公司慢查询阀值是500ms,找出这些SQL语句后,我们用到explain命令来查看这些SQL语句的执行计划,查看该SQL语句有没有使用上索引,有没有做全表扫描。把查询条件中没有建立索引的列创建索引。

四问:在创建联合索引时,你是怎样考虑多个字段之间的顺序的?

回答:在创建多列索引时,我们根据业务需求,where子句中使用最频繁的一列放在最左边,因为MySQL索引查询会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配。

所以当我们创建一个联合索引的时候,如(key1,key2,key3),相当于创建了(key1)、(key1,key2)和(key1,key2,key3)三个索引,这就是最左匹配原则。

五问:你提到MySQL中具体采用 B+树数据结构来实现索引,为什么会使用 B+树?

答:由于索引是存在于磁盘中,当索引非常大的时候,比如达到几个G的时候,无法一次加载到内存中,所以数据库中索引使用的是查找效率更高的树形结构。B+树是平衡多路查找树,是为磁盘等外存储设备设计的一种平衡查找树。

六问:说一说 B+树的优点

答:系统从磁盘读取数据到内存时是以磁盘块(block)为基本单位的,位于同一个磁盘块中的数据会被一次性读取出来,InnoDB存储引擎中有页(Page)的概念,页是其磁盘管理的最小单位。

InnoDB存储引擎中默认每个页的大小为16KB,可通过参数innodb_page_size设置页的大小,InnoDB在把磁盘数据读入到磁盘时会以页为基本单位,在查询数据时如果一个页中的每条数据都能有助于定位数据记录的位置,这将会减少磁盘I/O次数,提高查询效率。

B+树使用有序数组链表+平衡多叉树改良了B 树的有序数组+平衡多叉树;B+树的关键字全部存放在叶子节点中,非叶子节点用来做索引,而叶子节点中有一个指针指向一下个叶子节点。做这个优化的目的是为了提高区间访问的性能。

七问:可以举个例子说明一下

答:数据库索引采用B+树的主要原因是B树在提高了磁盘IO性能的同时并没有解决元素遍历效率低下的问题。正是为了解决这个问题,B+树应运而生。B+树只要遍历叶子节点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,也是 B+树的优势所在。

例如:要查 5-10之间的,B+树一把到5这个标记,再一把到10,然后串起来就行了。而B树在找到第一个符合条件的数字5后,访问完第一个关键字所在的块后,得遍历这个B树,获取下一个块,直到遇到一个不符合条件的关键字。遍历的过程是比较复杂的。

七问:那你知道B+ Tree的叶子节点都可以存哪些东西吗?

答:InnoDB的B+树可能存储的是整行数据,也有可能是主键的值,索引B+树的叶子节点存储了整行数据的是主键索引,也被称之为聚簇索引。

而索引B+树的叶子节点存储了主键的值的是非主键索引,也被称之为非聚簇索引。

八问:聚簇索引和非聚簇索引,在查询数据的时候有区别吗?

答:主键索引查询只会查一次,而非主键索引需要回表查询多次,通过覆盖索引也可以只查询一次,覆盖索引指一个查询语句的执行只用从索引中就能够取得,不必从数据表中读取。

MySQL只需要通过索引就可以返回查询所需要的数据,这样避免了查到索引后再返回表操作,减少I/O提高效率。如,表course中有一个普通索引 idx_key1_key2(key1,key2)。当我们通过SQL语句:select key2 from course where key1 = 'keytest';的时候,就可以通过覆盖索引查询,无需回表。

04

夺命连环问,你能抗住吗?

如果你能抗住这么多轮的夺命连环call,那威哥要恭喜你,你真的可以胜任P7级别的岗位了,还不知道P7是啥概念是吧,说月薪你是知道了,P7级别年薪50W-70W之间,阿里配股800-1200股,互联网大厂在这个级别略有一些差异,但不会差别过大。

如果这些问题你搞不定,那你可要下点功夫啦!

威哥想告诉你,不是你不会,是你还没看到这,学了,你就明白怎么回事了,这里给小伙伴们极力推荐一套索尔老师最新录制的《MySQL原理和调优》免费进阶课程!

免费!免费!免费!

索尔老师简介:阿里巴巴P7级Java架构师,10 年从业生涯期间主导过多个大型互联网项目的设计及研发工作。对区块链、机器学习有深入的研究。

教学风格独特、教学手段新颖,善于用浅显易懂的引导方式来剖析深层技术难点,培养学生近千人,多数学生已在滴滴、字节跳动、美团等一线互联网公司崭露头角,教学成功丰硕。

                   

课程简介:

套视频是MySQL高级进阶课程,为面试和工作提升必备课程。课程中以案例分析的形式进行MySQL优化的深度分析、以及介绍MySQL优化常用分析工具的使用。本套课程主要讲解MySQL优化和原理包括4大部分:

MySQL存储原理和效率提升

SQL优化和优化工具

MySQL全面优化

MySQL锁机制和优化原理

学习完本套课程,轻松应对工作和面试中对于MySQL优化的细节和原理分析。

通过本套课程的学习,你将具备:

1、 MySQL索引原理和数据结构

2、 MySQL引擎对性能的影响

3、 MySQL锁机制和性能分析

4、 MySQL性能分析常用工具的使用

如果每天几百万数据,一个月就是几千万了,有没有对于查询做一些优化呢?

这个问题有大,威哥下次再单独写一篇文章来详细解答这个问题,请持续关注“Java架构栈”公众号,更多干货和课程,只为帮助你成长得更快一点。

05

总结一下

Java开发的道路上任重而道远,这是好事,说明Java发展生命力极强,确实如此,威哥接触Java十多年了,眼睁睁的看着Java从编程语言排行榜No.1的位置到现在的No.1的位置,极其坚挺,除了跟老大哥C/C++平起平坐,谈笑风生。

目前乃至未来十年内,应该还没有可以抗衡的对手,学Java,那是一辈子的事情。

往期精彩内容

干货丨【UTF-8编码透析】神奇的“联通”乱码现象!

涛哥上新|SpringMVC入门实战经典教程重磅来袭!

干货!容器化CICD的实现方案

面试干货丨索尔MySQL进阶课程强势来袭!


文末互动福利

唠唠你面试时遇到奇葩事儿吧!

留言区分享给大家

集赞最多的同学将获得千锋系列丛书一本



扫码添加助理老师

领取课程源码、资料



关注【Java架构栈】 我们一起成长


原文作者:Java架构栈;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2021-04-13

  • 博文量
    573
  • 访问量
    243777