MySQL与Oracle聚簇索引的不同之处

聚簇索引对数据库查询优化,是一个重要的支撑点,聚簇索引的适用范围,也因数据库产品不同而有所差异。

大多据库的聚簇索引,与Oracle的聚簇索引有明显的不同,比如MySQL的聚簇索引相当于Oracle中的索引组织表(index organized table)。

为了说明Mysql聚簇索引,先把与聚簇索引相关的概念,稍带提及一下。由于,Oracle数据库中的索引概念更全面,因此,以Oracle中的索引来进行说明。

Oracle堆组织表(heap organized table)

堆(heap)在计算机科学领域,是一种得到深入研究的经典数据结构,Oracle把它作为默认的表类型(Oracle主要表类型有9种)。之所以提及堆组织表,是为了与B*Tree结构作对比。“堆”是一组空间,在数据存储方面,以某种随机的方式被使用,数据可以存放在任何位置上。

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结构中,数据访问相对会快一些。