mysql索引

54 阅读2分钟

一、InnoDB中索引的底层是什么?为什么用这个而不用红黑树或b树?

  1. 底层使用的数据结构为b+树
  2. 红黑树为二叉搜索树,不如多路搜索树每个节点存储的数据多,高度会更高,效率低
  3. b+树比之b树,叶子节点之间组成一个链表,方便遍历

二、什么是回表?如何避免回表?

  1. 回表其实就是,当我们使用索引查询数据时,检索出来的数据可能包含其他列,但走的索引树叶子节点只能查到当前列值以及主键ID,所以需要根据主键ID再去查一遍数据,得到SQL 所需的列
  2. 采用覆盖索引避免回表,例如构建姓名、成绩的联合索引,想获得的信息也在姓名、成绩之间,故不会回表

三、最左匹配原则是什么?

先匹配最左边的,索引只能用于查找key是否存在(相等),遇到范围查询 (>、<、between、like左匹配)等就不能进一步匹配了,后续退化为线性查找

四、聚簇索引和非聚簇索引?

  1. 聚簇索引:聚簇索引就是按照每张表的主键构造一颗B+树,同时叶子节点中存放的就是整张表的行记录数据,也将聚集索引的叶子节点称为数据页。这个特性决定了索引组织表中数据也是索引的一部分,每张表只能拥有一个聚簇索引。
  2. 非聚簇索引:非聚簇索引叶子节点存储的不再是行的物理位置,而是主键值。通过非聚簇索引首先找到的是主键值,再通过主键值找到数据行的数据页,再通过数据页中的Page Directory找到数据行,叶子节点除了包含键值外,还包含了相应行数据的聚簇索引键,每张表可以拥有多个非聚簇索引。