MySQL

了解过索引吗?什么是索引

嗯,索引在项目中非常常见,它是一种帮助MySQL高效获取数据的数据结构,主要用来提高数据检索效率,降低数据库的I/O成本。同时,索引列可以对数据进行排序,降低数据排序的成本,也能减少CPU的消耗。

索引的底层数据结构了解过吗

MySQL的默认存储引擎InnoDB使用的是B+树作为索引的存储结构。选择B+树的原因包括:节点可以有更多子节点,路径更短;磁盘读写代价更低,非叶子节点只存储键值和指针,叶子节点存储数据;B+树适合范围查询和扫描,因为叶子节点形成了一个双向链表。

B树和B+树的区别是什么呢?

B树和B+树的主要区别在于:

B树的非叶子节点和叶子节点都存放数据,而B+树的所有数据只出现在叶子节点,这使得B+树在查询时效率更稳定。

B+树在进行范围查询时效率更高,因为所有数据都在叶子节点,并且叶子节点之间形成了双向链表。

为何B+树叶子存数据,非叶子不存?

非叶子节点只存键与指针,单个节点可以容纳更多的索引项,从而增加树的扇出度(每个节点的孩子数)。相同大小的磁盘页中,B+ 树内部节点能存更多键,令树更“矮胖”,减少层级深度。 每次查找所需的磁盘块读取次数也随之降低,从而显著减少磁盘 I/O 代价。

所有的键最终都出现在叶子节点,导致任意一次查找都必须从根节点遍历到叶子节点,路径长度固定,查询性能稳定,可预测,不会因部分命中而产生波动。

叶子节点通过链表顺序相连,方便进行顺序扫描和范围查询;若内部节点也存数据,则链表维护更复杂,且需要额外处理非叶子层的数据遍历。

讲讲索引的分类是什么?

MySQL可以按照四个角度来分类索引。

  • 按「数据结构」分类:B+tree索引、Hash索引、Full-text索引
  • 按「物理存储」分类:聚簇索引(主键索引)、二级索引(辅助索引)
  • 按「字段特性」分类:主键索引、唯一索引、普通索引、前缀索引
  • 按「字段个数」分类:单列索引、联合索引

什么情况下索引会失效?

  • 没有遵循最左匹配原则。

  • 使用了模糊查询且%号在前面。

  • 在索引字段上进行了运算或类型转换。

  • 在 WHERE 子句中,如果在 OR 前的条件列是索引列,而在 OR 后的条件列不是索引列,那么索引会失效。

知道什么叫覆盖索引吗

覆盖索引是指在SELECT查询中,返回的列全部能在索引中找到,避免了回表查询,提高了性能。使用覆盖索引可以减少对主键索引的查询次数,提高查询效率。

image.png

next