备战JAVA面试——MySQL篇

备战JAVA面试系列

序号文章地址
1MySQL篇博客地址
2集合框架篇博客地址

        ~~~~~~~        前言:最近一次面试,被面试官的终极拷问给难到了,以前学的知识太杂,最近打算好好整理一下。这篇主要是关于Mysql的,Mysql的面试问题主要集中在索引部分,之前的开发过程中只是用到过索引,并没有好好了解其原理以及一些应用场景,恶补一下。



索引

1、为什么要使用索引

因为索引能够避免全表扫描去查找数据,提升检索效率

2、什么样的信息能成为索引

主键、唯一键等只要是能让数据具备区分性的字段都可以成为索引

3、为什么使用B+树作为索引的数据结构?

B+树更适合用来做存储索引

  • B+树的磁盘读写代价更低
  • B+树的查询效率更加稳定
  • B+树更有利于对数据库的扫描

我自己的总结:B+树相比B树,所有的非叶子节点只用来索引,数据都保存在叶子节点中,所以查询效率更加稳定;B+树所有叶子节点都有一个指针指向下一个叶子节点,所以在做范围查询时可以有更高的效率。

4、既然B+树效率高,为什么还要有Hash索引数据结构

Hash索引是基于Hash表实现的,只有查询条件精确匹配Hash索引中的所有列的时候,才能用到Hash索引。因为Hash索引本身只需要存储对应的Hash值,所以索引的结构十分紧凑,这也让Hash索引查找的速度非常快。但是,Hash索引不支持范围查询,并且Hash码的计算可能存在Hash冲突,所以Hash索引不适用于选择性很差的列上。

5、密集索引和稀疏索引的区别

密集索引文件中的每个搜索码值都对应一个索引值
可以理解为:叶子节点不仅仅保存的是键值,还保存了位于同一行里的其他列的值
由于密集索引决定了表的物理排列顺序,所以一个表里只能有一个密集索引

稀疏索引文件只为索引码的某些值建立索引项
可以理解为:叶子节点仅保存了键位信息即该行数据的地址,定位到叶子节点后,还需要根据地址进一步定位信息

MyISAM:不管是主键索引、唯一键索引或者普通索引均属于稀疏索引
InnoDB:必须有且仅有一个密集索引,选取规则如下:

  • 若一个主键被定义,该主键则作为密集索引
  • 若没有主键被定义,该表的第一个唯一非空索引则作为密集索引
  • 若不满足以上条件,innoDB内部会生成一个隐藏主键(密集索引)(这个隐藏的主键是一个6字节的列,该列的值会随着数据的插入而自增)
  • 非主键索引存储相关键位和其对应的主键值,包含两次查找

6、如何定位并优化慢查询SQL

  • 根据慢日志定位慢查询SQL
  • 使用explain等工具分析SQL
  • 修改SQL或者尽量让SQL走索引

7、联合索引的最左匹配

联合索引:由多列组成的索引

  • 最左前缀匹配原则,非常重要的原则,Mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a=3 and b=4 and c>5 and d=6 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。
  • =和in可以乱序,比如a=1 and b=2 and c=3建立(a,b,c)索引可以任意顺序,Mysql的查询优化器会帮你优化成索引可以识别的形式。

讲讲我自己的理解:因为索引的数据结构使用的是B+树,当然联合索引使用的也是B+树,只不过是联合索引的键值数量不是一个,而是多个。构建一颗B+树只能根据一个值来构建,因此数据库依据联合索引最左边的字段来构建B+树。

8、索引是建立得越多越好吗

  • 数据量小的表不需要建立索引,建立会增加额外的索引开销
  • 数据库变更需要维护索引,因此更多的索引意味着更多的维护成本
  • 更多的索引意味着也需要更多的空间

锁和事务

9、MyISAM与InnoDB关于锁方面的区别是什么?

  • MyISAM默认用的是表级锁,不支持行级锁
  • InnoDB默认用的是行级锁,也支持表级锁

10、数据库事务的四大特性

11、事务隔离级别以及各级别下的并发访问问题

12、InnoDB可重复读隔离级别下如何避免幻读

13、RC、RR级别下的InnoDB的非阻塞读如何实现

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值