前言
没有前言,废话不多说,直接开始面试
面试开始
面试官:什么是索引
- 索引就是一种数据结构,提高检索效率的数据结构。比如B+树,哈希
面试官:说说你对B+树的了解
- B+树是一颗平衡多叉树,相对B树来说,B+树的数据只存在叶子节点。叶子节点组成链表,因此可支持范围查询。B+树的查询效率为:O(logH),H为B+数的高度。
面试官:为什么InnoDB使用B+树作为索引结构,而不用B树?
- 首先B+树和B树比较,B树因为非叶子节点也存储数据,因此非叶子能存储的内存页就少了。在相同数据量时,B树的高度比B+树高,因此需要IO的次数更多,从而使得B树的总体效率慢于B+树。
- B树不支持范围查询,因为B树的叶子节点没形成链表。
- B+树的数据都在叶子节点,查询性能更稳定。
面试官: 索引有哪些分类
- 主键索引、非主键索引(普通索引、唯一索引、联合索引)
面试官:主键索引和非主键索引有什么区别?
- 在 InnoDB 里,主键索引也被称为聚簇索引,叶子节点存的是整行数据
- 在 InnoDB 里,非主键索引也被称为二级索引,叶子节点内容是主键的值
mysql> create table T(
id int primary key,
k int not null,
name varchar(16),
index (k))engine=InnoDB;
主键索引和非主键索引(图片摘自网络)
面试官:那你了解回表吗
- 如果语句是 select * from T where ID=300,即主键查询方式,则只需要搜索 ID 这棵 B+ 树;
- 如果语句是 select * from T where k=3,即普通索引查询方式,则需要先搜索 k 索引树,得到 ID 的值为 300,再到 ID 索引树搜索一次。这个过程称为回表。
- 也就是说,基于非主键索引的查询需要多扫描一棵索引树。因此,我们在应用中应该尽量使用主键查询。
面试官:命中索引的原则?
- 只要满足”覆盖索引原则“或”最左前缀原则“中的任意一个,都可使用索引。
- 详情见MySQL索引使用规则
面试官:什么是覆盖索引?
- 覆盖索引,就是指一个查询语句的执行只用从索引中就能够取得,不必从数据表中读取。也可以称之为实现了索引覆盖。
面试官:最后一个问题,遇到慢查询时,如何解决?
- 定位问题:首先通过查询慢日志,确定具体是哪条SQL语句出现了慢查询
- 分析问题:接着,SQL慢的原因一般有2种,一是没用索引,二是用错索引
- 解决问题:如果是没用索引,那我们可以使用explain来分析SQL语句,确定是否使用了索引。如果使用了索引,是否用对索引,如果用错索引了,就使用force index()来强制使用某个索引。如果面试官继续问你,为什么会用错索引?简单点说,InnoDB选择使用哪个索引是根据一个值来确定的,而这个值是根据样本值算出来的,因为是样本,抽样就比较随机,因此出错也不是不可能的。
面试官:面试结束 恭喜进入下一轮面试
总结
其实,关于索引还有很多知识点的,这里不一一展开
- 选择什么字段做索引
- 索引下推
- explain的字段的含义,如何根据字段来调优
絮叨
非常感谢你能看到这里,如果觉得文章写得不错 求关注 求点赞 求分享 (对我非常非常有用)。
如果你觉得文章有待提高,我十分期待你对我的建议,求留言。
如果你希望看到什么内容,我十分期待你的留言。
各位的捧场和支持,是我创作的最大动力!
参考资料
- 《高性能MySQL》
- 《MYSQL实战45讲》
网友评论