一、前言
MySQL 作为主流的数据库,是各大厂面试官百问不厌的知识点,但是需要了解到什么程度呢?仅仅停留在 建库、创表、增删查改等基本操作的水平可不够。在面试后端开发的时候,一连几个问题,简直会被问到一脸懵⭕️。。
面试官:MySQL 语句怎么优化?
面试官:分库,分表都适合哪些场景?
面试官:讲讲 InnoDB 如何使用 B+ 树存储的?
还有很多栗子,这里就不一一论述学习MySQL 的重要性了。
二、MyISAM 索引实现
MyISAM 引擎使用 B+Tree 作为索引结构,叶节点的 data 域存放的是数据记录的地址。下图是 MyISAM 索引的原理图:
这里设表一共有三列,假设我们以 Col1 为主键,则图 8 是一个 MyISAM 表的主索引(Primary key)示意。可以看出 MyISAM 的索引文件仅仅保存数据记录的地址。
辅助索引
在 MyISAM 中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求 key 是唯一的,而辅助索引的 key 可以重复。如果我们在 Col2 上建立一个辅助索引,则此索引的结构如下图所示
同样也是一颗 B+Tree,data 域保存数据记录的地址。因此,MyISAM 中索引检索的算法为首先按照 B+Tree 搜索算法搜索索引,如果指定的 Key 存在,则取出其data 域的值,然后以 data 域的值为地址,读取相应数据记录。
MyISAM 的索引方式也叫做“非聚集索引”,之所以这么称呼是为了与 InnoDB的聚集索引区分。
三、mysql索引知识
1 B+Tree索引
在InnoDB中,表都是根据主键顺序以索引的形式存放的,这种存储方式的表称为索引组织表(IOT),InnoDB使用B+树索引模型,数据都是存储在B+树中的。
假设,有一个表的主键列为ID,字段为k,并且在k上有索引。表中R1~R5的(ID,k)值分别为(100,1)、(200,2)、(300,3)、(500,5)、(600,6),**每一个索引在****InnoDB里面对应一棵B+****树,**两棵树的简意示意图如下:
2 主键索引和普通索引的区别
- 主键索引的叶子节点存的是整行数据。主键索引也被称为聚簇索引(clustered index)
- 非主键索引的叶子节点内容是主键的值。非主键索引也被称为二级索引(secondary index)
如果语句是select * from T where ID=500,即主键查询方式,则只需要搜索ID这棵B+树;
如果语句是select * from T