Oracle与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结构中。