Skip to content

跳槽必看のMySQL索引:B+树原理揭秘与索引优缺点分析

今天给大家分享一下数据库索引的详解文章,这基本是必考的知识点。

一、索引介绍

1、索引定义

索引是存储引擎中,用于快速找到记录的一种数据结构。索引能够帮助存储引擎快速获取数据,形象的说就是索引是数据的目录。

所谓的存储引擎,通俗的来说就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等 技术的实现方法。

MySQL存储引擎有MyISAMInnoDBMemory,其中InnoDB是在MySQL 5.5之后成为默认的存 储引擎。

在实际场景中,索引对于良好的性能起到非常关键的作用。或许在数据量小且负载较低时,索引的不恰当使用可能对性能的影响可能不会太明显,但是当表中的数据量越来越大的时候,索引对性能的影响就愈发重要,不恰当的索引会让性能急剧的下降。

2、索引的查找方式

MySQLInnoDB存储引擎中

若没有索引的情况下进行数据查询

a) 在一个数据页中查询

当表中的记录比较少时,所有记录可以存放到一个数据页中。当查询记录时,根据搜索条件的不同查询分为两种情况:

  • 主键为搜索条件:在一个数据页内的记录会根据主键值的大小从小到大的顺序组成一个单向链表。每个数据页都会为存储在它里面的记录生成一个页目录。通过主键查询某条记录可以在页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组的记录,即可快速找到指定的记录。
  • 其他列作为搜索条件:对于非主键列的查找,由于没有为非主键列建立对应的目录页,即未创建索引。无法用二分法快速定位相应的槽,只能从Infimum记录开始依次遍历单向链表中的每条记录,然后对比每条记录是否符合搜索条件,即全表扫描,因此效率非常低。

b) 在多个数据页中查询

在很多情况下,表中存放的记录是非常多的,需要查询到的数据可能分布在多个数据页中,在多个页中查找记录可以分为两个步骤:

  • 定位到记录所在的页
  • 从所在的页内查找相应的记录

在没有索引的情况下,无论是根据主键列还是其他列的值查找,都不能快速定位到记录所在的页,因此只能从第一页沿着双向链表一直往下找,因而非常耗时。

若存在索引的情况下进行数据查询

在创建索引的情况下,每个数据页都会为存储在它里面的记录生成一个目录项,在通过索引查找某条记录时可以在页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录,快速找到指定的记录,确定记录后,即可向下寻找当前记录对应的下一个页节点,直到寻找到存在目标记录的叶子结点。