堆表(heap table)和索引组织表(Index Oragnization Table,简称IOT)是两种数据表的存储结构
Oracle支持堆表,也支持索引组织表
PostgreSQL只支持堆表,不支持索引组织表
Innodb只支持索引组织表
MyIASM只支持堆表
堆表和索引组织表的区别
堆表
- 堆就是无序数据的集合,索引就是将数据变得有序,在索引中键值有序,数据还是无序的
- 数据存放在数据里面,索引存放在索引里
- 堆表中,主键索引和普通索引一样的,叶子节点存放的是指向堆表中数据的指针(可以是一个页编号加偏移量),指向物理地址,没有回表的说法
- 堆表中,主键和普通索引基本上没区别,和非空的唯一索引没区别
- mysql 的 myisam 引擎,oracle pg 都支持的是堆表
索引组织表
- innodb 引擎支持的就是索引组织表
- 对于主键的索引,叶子节点存放了一整行所有数据,其他索引称为辅助索引(二级索引),它的叶子节点只是存放了键值和主键值
- 主键包含了一张表的所有数据,因为主键索引的页子节点中保存了每一行的完整记录,包括所有列。如果没有主键,MySQL会自动帮你加一个主键,但是对用户不可见
- innodb中数据存放在聚集索引中,换言之,按照主键的方式来组织数据的
- 其他索引(唯一索引,普通索引)的叶子节点存放该索引列的键值和主键值
- 不管是什么索引非叶子节点存放的存放的就是键值和指针,不存数据,这个指针在innodb中是6个bit,键值就看数据大小了
在mysql中除了主键索引,其他都是二级索引 , 这些索引都是针对索引树做的二次索引树(因为只存真实数据都在主键里了), 这就是为什么它叫二级索引 以及会出现索引回表, 这全是由于数据存储结构引起的
深入理解Oracle表(6):堆组织表(HOT)和索引组织表(IOT)的区别_linwaterbin的博客-CSDN博客_堆组织表 索引组织表