备战JAVA面试系列
序号 | 文章 | 地址 |
---|---|---|
1 | MySQL篇 | 博客地址 |
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默认用的是行级锁,也支持表级锁