Mysql 索引的原理和实现

mysql的索引采用的是B+Tree数据结构

在mysql中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式不同。下面会叙述MyISAM和InnoDB这两个存储引擎的索引实现方式。

(只看图和文字可能还是会不清楚,可以看一下视频,亲测讲得很清楚)

 

下述用到的数据表图:

 

 

InnoDB索引实现

InnoDB存储引擎使用B+Tree作为索引结构,叶节点的data域存放的是完整的数据记录。这种索引叫做聚集索引(之所以这么称呼,是为了与MyISAM 非聚集索引区分)

这个索引的key是数据表的主键,因此InnoDB的表数据文件本身就是主索引

InnoDB索引的原理图如下:

 

 

 

1.InnoDB要求表必须有主键,如果没有显式指定,则Mysql系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,Mysql自动为InnoDB表生成一个隐含字段为主键,类型为长整型。

2.同时,请尽量在InnoDB上采用自增字段做表的主键。因为InnoDB数据文件本身是一颗B+Tree,非单调的主键会造成再插入新记录时,会为维持主键顺序,而分裂调整,十分低效。

3.如果在Col3字段上建立一个辅助索引(辅助索引图如下),data域存储的是对应主键的值。

 

 4.聚集索引这种实现方式使得主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:一,检索辅助索引获得主键;二,用主键到主索引中获得记录。

5.不建议使用过长的字段作为主键,因为辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。

MyISAM索引实现

MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。下图是 Col1为主键,下图是MyISAM的主索引原理图:

 

1.辅助索引, 在MyISAM中,主索引和辅助索引在结构上没有区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。如果我们在Col2上建立一个辅助索引,则此索引的结构如下图所示:

 

 2.MyISAM中索引检索的算法为一,按照B+Tree搜索算法搜索索引,如果指定的key存在,则去除data域的地址;二,拿着地址获取相应数据记录。

 

posted on 2020-12-09 13:47  CHENSISI  阅读(485)  评论(0编辑  收藏  举报