索引组织表(Index-Organized Tables)
索引组织的表具有B树的变体的存储组织。以主键排序的方式将索引组织表的数据存储在B树索引结构中。索引结构中的每个叶块都存储关键字列和非关键列。对应的主键索引也叫聚集索引,其他列的索引叫secondary index,也叫做二级索引。二级索引的每条记录都包含该行的主键值,InnoDB使用这个主键值来搜索聚集索引中的行。因此,较短的主键值是有利的,可以缩小二级索引的空间。
聚集索引 clustered index
每个表都有一个聚集索引,其实上面所说的主键索引也叫聚集索引,严格意义上是不正确的。因为:
- 可能表并没有定义主键,那么InnoDB会将唯一索引并且没有null的列作为聚集索引
- 如果也不符合上述情况,InnoDB就会使用一个6字节的隐藏ID作为聚集索引(这个ID也是自增的,但是会和其他与此情况相同的表共用这些ID值)
聚集索引的而叶子节点存储了行中所有列的信息,还包括额外的row_id,rollback pointer,trix_id等信息,这些信息会在MVCC中用到。
堆组织表(Heap Organize Table)
就是一般的表,数据插入时存储位置是随机的,主要是数据库内部块的空闲位置决定的。
堆表中,主键索引和普通索引一样,叶子节点存放的都是指向堆表中数据的指针(指向物理地址)。
MySQL的MyISAM 和 oracle都支持堆表