乐趣区

关于mysql:面试MySQL索引

前言

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

面试开始

面试官:什么是索引

  • 索引就是一种数据结构,进步检索效率的数据结构。比方 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 讲》
退出移动版