myisam的索引结构
MySQL的MyISAM存储引擎使用两种不同的索引结构:主索引和辅助索引。
1. 主索引 (Primary Index):
对于MyISAM表来说,主索引是按照主键(primary key)来构建的,也可根据唯一键(unique key)来构建。主索引使用B+树结构,每个叶子节点都存储了整行数据的主键和主键值,而非主键的其他列只存储在数据文件中。主索引的叶子节点也包含了指向辅助索引的指针。
主索引的优点是能够快速查一些特定的主键值,因为B+树结构能够提供对数时间复杂度的查操作。然而,主索引的缺点是当需要基于非主键列进行查询时,效率较低,因为非主键列只能通过主索引的叶子节点指向辅助索引来查询。
2. 辅助索引 (Secondary Index):
辅助索引也使用B+树结构,类似于主索引,但是叶子节点存储的是辅助索引的键值和指向实际数据行的指针,而非主键值。辅助索引也有自己的叶子节点,这些叶子节点之间没有通过指针互连。
辅助索引的优点是可以加速基于非主键列的查询操作。当执行使用非主键列进行条件查询时,MySQL可以先在辅助索引中到满足条件的行的主键值,然后再利用主索引的叶子节点指针到实际的行数据。这个过程被称为"回表"。
辅助索引的缺点是在插入、更新和删除操作时,需要同时更新辅助索引和主索引,因此会导致更慢的写入速度。
查看mysql索引需要注意的是,MyISAM存储引擎并不支持聚簇索引(clustered index),因此数据在磁盘上的存储顺序并不是按照主键的顺序排列的。
在MyISAM中,用户可以显式指定主键和辅助索引,也可以只指定主键而不指定辅助索引。没有主键的表将会以第一个唯一键作为虚拟的主键。
- High Performance MySQL: Optimization, Backups, and Replication, by Baron Schwartz, Peter Zaitsev and Vadim Tkachenko