前言

没有前言,废话不多说,直接开始面试

面试开始

面试官:什么是索引

  • 索引就是一种数据结构,提高检索效率的数据结构。比如B+树,哈希

面试官:说说你对B+树的了解

  • B+树是一颗平衡多叉树,相对B树来说,B+树的数据只存在叶子节点。叶子节点组成链表,因此可支持范围查询。B+树的查询效率为:O(logH),H为B+数的高度。

面试官:为什么InnoDB使用B+树作为索引结构,而不用B树?

  • 首先B+树和B树比较,B树因为非叶子节点也存储数据,因此非叶子能存储的内存页就少了。在相同数据量时,B树的高度比B+树高,因此需要IO的次数更多,从而使得B树的总体效率慢于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讲》