索引的实现
一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上。这样的话,索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级,而B-Tree的高度低(多叉树),可以减少I/O次数
InnoDB(聚簇索引)的数据文件本身就是索引文件(索引和数据存放在一个文件idb)。从上文知道,MyISAM(非聚簇索引)索引文件(MYI)和数据文件(MYD)是分离的,索引文件仅保存数据记录的地址。
mysql中每个表都有一个聚簇索引(clustered index ),除此之外的表上的每个非聚簇索引都是二级索引(普通索引、唯一索引),又叫辅助索引(secondary indexes)。
实现区别
MyISAM引擎使用B+Tree作为索引结构,叶结点的data域存放的是数据记录的地址。MyISAM的索引方式也叫做“非聚集”的。
MyISAM左图为主索引,右图为辅助索引(二级索引),两者在结构上没什么区别,都是B+树。
虽然InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同。
InnoDB左图为主索引、右图为辅助索引,辅助索引结构也是B+树
第一个重大区别是InnoDB的数据文件本身就是索引文件。从上文知道,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶结点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。
第二个与MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为data域。
这里以英文字符的ASCII码作为比较准则(排序)。聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。
由于实际的数据页只能按照一颗B+树进行排序,因此每张表只能有一个聚集索引。