1. InnoDB 和 MyISAM 索引结构的区别
InnoDB:
聚簇索引:InnoDB 默认使用聚簇索引(Clustered Index)。在聚簇索引中,数据和索引存储在同一个数据结构(B+ 树)中,叶子节点存储实际的数据行,而非叶子节点存储的是索引键。
数据和索引存储在一起:由于数据存储在索引的叶子节点中,查询基于聚簇索引时不需要回表。也就是说,在基于主键查询时,索引本身就包含了数据。
主键索引:每张表只能有一个聚簇索引,通常这是表的主键(如果没有显式定义主键,InnoDB 会自动选择一个唯一索引作为主键)。
MyISAM:
非聚簇索引:MyISAM 使用非聚簇索引(Non-clustered Index)。在 MyISAM 中,数据和索引是存储在不同的文件中的,索引存储的是数据的地址(指针),而不是数据本身。
索引和数据分离:MyISAM 的叶子节点并不存储实际的数据,而是存储数据的物理地址。因此,在查询时,必须通过索引找到数据的物理位置,再回表获取数据。
2. MyISAM 是否有聚簇索引
MyISAM 不支持聚簇索引。因为 MyISAM 的索引和数据是分开的,所有的索引都是 非聚簇索引。MyISAM 不会将数据行本身存储在索引的叶子节点中,而是将索引与数据分开存储,所以没有聚簇索引的概念。
3. 总结:
InnoDB 支持 聚簇索引,数据和索引存储在一起,查询效率更高(特别是主键查询)。
MyISAM 使用 非聚簇索引,索引和数据分开存储,查询时需要回表,性能相对较低。