聚簇索引对比|Oracle vs MySQL

Oracle聚簇索引与大多数据库聚簇索引不同,MySQL聚簇索引相当于Oracle索引组织表(index organized table)。

Oracle堆组织表(heap organized table)

(heap)是一种得到深入研究的经典数据结构,Oracle将堆作为默认表类型(Oracle主要表类型有9种)。

“堆”是一组空间,在数据存储方面以某种随机方式被使用,数据可以存放在任何位置上。

Oracle索引组织表(index organized table/IOT)

以B*Tree结构存储,在组织数据时强制要求数据行有某种物理顺序,数据按照索引结构存储,通常根据主键有序存储在IOT中。

如:以用户ID为键将用户多个收货地址,安排到相邻物理位置上。

这样,一个用户所有收货地址都存储在一起,不会被随机安排在磁盘各个位置上。

Oracle聚簇索引

Oracle聚簇索引中聚簇是指:如果一组表有一些共同列,则将这组表存储在相同数据块中。

也就是说:聚簇是将一组表相关列上数据存储在同一块中,若一个块不能完成存储就用多个块。

如此,一组表中相关联列在物理上已经联在一起了(“预连接”),聚簇也可用于单个表。

Oracle中聚簇不是为了有序存储数据(这是IOT的工作),它是按某个键以聚簇方式存储数据。

如:在多个表关联查询中,表之间在物理上已经存在关联(“预连接”),查询效率会得到提升。

对关联查询操作很有帮助。

这是Oracle索引组织表(IOT)与聚簇索引的区别。

MySQL聚簇索引(innodb)

Mysql聚簇索引通常以主键为索引列,Mysql聚簇索引相当于Oracle中索引组织表。

Mysql聚簇索引将数据存放在B*Tree叶节点上,直接读取数据。

MySQL非聚簇索引B*Tree叶节点上,存放指向数据行指针。

MySQL聚簇索引不仅仅是一种索引类型,也是一种数据存储方式。

将相关数据安排在一起减少磁盘I/O,数据与索引都存放在B-Tree结构中。