MyISAM是MySQL 5.5之前版本默认的存储引擎,从5.5之后,InnoDB开始成为MySQL默认的存储引擎。
MyISAM 使用B Tree实现主键索引、唯一索引和非主键索引。
InnoDB 中非主键索引使用的仍是B Tree数据结构,而主键索引使用的是B+Tree。
一般文件系统采用的是B Tree
索引为什么选用B树这种数据结构?
一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上。这样的话,索引查找过程中就要产生磁盘I/O的消耗,所以评价一个索引的优劣的重要指标就是I/O的操作次数。
I/O的操作次数与数的高度有关。数的高度O(h)=O(logdN)。由此可见d越大索引的性能就越好。相对于B-Tree而言,B+Tree内节点去掉了data域,因此可以拥有更大出度,故使用B+Tree。
因为使用B树查找时,所用的磁盘IO操作次数比平衡二叉树更少,效率也更高。
为什么使用B树查找所用的磁盘IO操作次数比平衡二叉树更少?
大规模数据存储中,树节点存储的元素数量是有限的(如果元素数量非常多的话,查找就退化成节点内部的线性查找了),这样导致二叉查找树结构由于树的高度过大而造成磁盘I/O读写过于频繁,进而导致查询效率低下。那么我们就需要减少树的高度以提高查找效率。而平衡多路查找树结构B树就满足这样的要求。B树的各种操作能使B树保持较低的高度,从而达到有效减少磁盘IO操作次数。
MySQL索引实现
MySQL中,索引属于存储引擎级别的概念,不同的存储索引对索引的实现方式是不同的。
MyISAM索引实现
MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。
l MyISAM的索引文件仅仅保存数据记录的地址。在MyISAM中,主索引和辅助索引在结构上没有区别。
l MyISAM的索引方式也叫做“非聚集”的,之所以这么称呼是为了与InnoDB的聚集索引区分。
InnoDB索引实现
InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同
1) MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。
InnoDB的数据文件本身就是索引文件,即数据文件本身就是按B+Tree组织的一个索引结构,叶子节点data保存了完整的数据记录。
2) InnoDB的辅助索引data域存储相应记录主键的值而不是地址。
聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。