【大厂面试官】一条SQL,我怎么知道它有没使用到索引?
- 面试官:知道索引有什么类型吗?
- 面试官:B树索引说一下?
- 面试官:你刚刚说值都存储在叶子节点,那有什么好处?
- 面试官:知道为什么主流数据库引擎不采用哈希索引吗?
- 面试官:聚簇索引和二级索引有什么关联?
- 面试官:那我一条SQL,我怎么知道它有没使用到索引?
- 面试官:有没索引失效的情况呢?
逮嘎猴,我是南哥,一个Java进阶的领路人,跟着南哥我们一起Java进阶。
本文收录在我开源的《Java进阶指南》中,一份帮助小伙伴们进阶Java、通关面试的Java学习面试指南,相信能帮助到你在Java进阶路上不迷茫。南哥希望收到大家的 ⭐ Star ⭐支持,这是我创作的最大动力。GitHub地址:https://github.com/hdgaadd/JavaGetOffer。
文章目录
- 索引类型
- B-Tree索引
- B-Tree值的存储
- 哈希索引
- 聚簇索引
- 索引效率
- 索引失效情况
1. 索引类型
面试官:知道索引有什么类型吗?
知道的,我了解的主要有B树索引、哈希索引。
面试官思考中…
1.1 B-Tree索引
面试官:B树索引说一下?
好的面试官。
- 在结构方面,B-Tree不同于二叉搜索树,它是多子树的
- 在值的存储方面,所有的值都存储在叶子节点,且叶子节点可以存储多个值
- 另外叶子节点之间用指针链接形成双向链表。如果是二级索引建立的B-Tree,每个叶子节点的值有保存对应行数据的主键
面试官思考中…
1.2 B-Tree值的存储
面试官:你刚刚说值都存储在叶子节点,那有什么好处?
嗯有两方面。
值都存储在叶子节点,使得非叶子节点层数更少,整棵B-Tree的高度变得矮胖,可以提高搜索的效率。
另外业务上一般都是范围查询,值都存储叶子节点同时形成双向链表,很适合范围查询。
面试官思考中…
1.3 哈希索引
面试官:知道为什么主流数据库引擎不采用哈希索引吗?
hhh就像我刚刚说的,业务上一般都是范围查询,而哈希索引不支持任何范围查询。
哈希索引会为所有的索引列计算一个哈希码,在哈希表中保存哈希码和指向每个数据行的指针,这种结构对精确匹配查询效率才高。
面试官思考中…
2. 聚簇索引
面试官:聚簇索引和二级索引有什么关联?
好的面试官。
是这样的,二级索引指的是非主键索引,它的叶子节点保存的只是行的主键值,所以需要通过主键来找到行数据。
而聚簇索引是通过主键来建树,叶子节点包含了行的全部数据,主键索引就是聚簇索引。
所以通过二级索引查找行,需要先在二级索引建立的B-Tree上找到主键值,再从聚簇索引建立的B-Tree找到行数据。
面试官思考中…
3. 索引效率
面试官:那我一条SQL,我怎么知道它有没使用到索引?
可以使用Explain关键字来分析,它会模拟执行sql语句,查询出sql语句执行的相关信息,如哪些索引可以被命中、哪些索引实际被命中。
我说下Explain查询结果的几个关键字段。
-
type
- cost:通过索引一次查询
- ref:使用到索引
- range: 使用到索引
- all:全表扫描
-
Extra
-
using filesort:使用外部文件排序,发生在无法使用索引的情况下
-
using index:where查询的列被索引覆盖,直接通过索引就可以查询到数据
-
using where:where查询的列,没有全部被索引覆盖
-
using join buffer:使用了连接缓存
-
-
possible_key
表示可以使用的索引
-
key
表示实际使用的索引
3.1 索引失效情况
面试官:有没索引失效的情况呢?
有的,索引失效一般是这个SQL查询破坏了使用B-Tree查询的条件。
-
对索引列进行数学函数处理的话,索引会失效
-
索引是字符串类型,查询值没有添加单引号''那索引会失效。因为值类型与索引列类型不一致,MySQL不会使用索引,而是把索引列数据进行类型转换后进行查询
-
对索引列进行模糊查询,%要放在最右侧,否则索引失效
SELECT * FROM user WHERE name LIKE n%
-
组合索引,前一个索引使用范围查询,后面的索引也会失效
大概是这些情况。
面试官抓抓脑袋,继续看你的简历......
得想想考点你不懂的😰
最后,评论区说它好孤独的!!它需要你们的吐槽。关于Java技术、牛友的迷茫、简历等问题来评论区和南哥、牛油们一起吐槽分析分析。
#大厂##大厂面试##MySQL##Java##MySQL面试#创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️❤️