1.MyIsAM存储引擎索引实现(非聚集索引)
非聚集索引:索引文件和数据文件分开的。
如下图MyIsAM存储引擎索引文件和数据文件是分离的,以查找索引id30为例子,mysql会先在B+树中进行3次磁盘IO找到索引30的磁盘地址0xF3,然后在磁盘中找出整行数据信息
2.InnoDB存储引擎索引实现(聚集索引)
聚集索引-索引文件和数据文件放在一起的。单从效率上来说聚集索引比非聚集索引要高,因为聚集索引在同一个文件就能完成查找,而非聚集索引要跨文件进行查找。
在建表不添加主键的时候mysql会自动找一列来做主键。
所以在建数据库表的时候建议用整型自增做主键,而且尽量别用UUID做主键,由上面B+树的排序也能看出用整型做主键查找效率高很多。
对于非主键索引,也是用B+树形式由左到右增加的,如下图的name字段,就是由字母从左到右进行排好序的,非主键索引data中存的是主键索引值,而非存放具体数据,目的是为了一致性的节省存储空间,通过主键索引就能回找到data数据了,这个过程也叫回表查询。
如下图,Secondary Key也叫非聚集索引,因为Secondary Key只是存放了主键索引值,对于数据库来说还要做一次回表查询才能找到数据。