P7程序员如何解答数据库索引?

相信很多小伙伴在面试时都会经历数据库相关的问题,数据库属于一个应用的最底层,数据库的性能优化,对于应用来说至关重要,数据量小还好说,但请问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股,互联网大厂在这个级别略有一些差异,但不会差别过大。

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

 需要更多教程,微信扫码即可
       

         别忘了扫码领取资料哦
                 【高清Java学习线路图】和【全套学习视频及相关资料】

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值