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域的地址;二,拿着地址获取相应数据记录。