MySQL中的MyISAM与InnoDB存储引擎在索引实现上都采用了B+树结构,那么它们之间具体有哪些区别呢?今天我们就来详细聊聊这个话题。
首先,我们创建一张示例表,SQL语句如下:
CREATE TABLE `t_user` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`name` varchar(16) DEFAULT NULL,`email` varchar(32) DEFAULT NULL,`phone` varchar(11) DEFAULT NULL, PRIMARY KEY (`id`),KEY `k_name` (`name`)) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
除了主键id字段外,我们还在name字段上添加了一个普通索引,并插入了6条测试数据:
图片
1.MyISAM
MyISAM将索引文件与数据文件分开存储,索引文件仅保存数据记录所在的数据页地址。
1.1 主键索引
MyISAM存储引擎使用B+树索引结构,其非叶子节点存储索引键值,而叶子节点则保存了主键值及对应的数据记录地址。由于叶子节点不直接存储实际数据,这种索引方式被称为“非聚集索引”。
图片
1.2 非主键索引
主键索引与非主键索引在结构上完全一致,唯一的区别在于非主键索引允许出现重复的键值。下面我们来看一下k_name这个索引的具体结构:
图片
2.InnoDB
与MyISAM不同,InnoDB采用B+树组织成聚集索引,其主键索引的叶子节点保存了完整的数据记录。因此InnoDB的数据文件本身即为索引文件。
2.1 主键索引
InnoDB主键索引的键值为主键值,而数据域则保存了完整的数据行记录。如下图所示:
图片
2.2 非主键索引
InnoDB的普通索引键值保存索引字段值,数据域则存储对应记录的主键值,查询时需要先通过普通索引找到主键,再根据主键回表查询完整记录。如下图所示:
图片
3.总结
虽然MyISAM和InnoDB存储引擎都使用B+树索引,但二者的索引结构存在本质区别:一种是聚集索引,另一种则是非聚集索引。
