在详细阐述这个问题之前,先了解一下索引的相关内容:
大家都知道利用索引可以快速定位到记录,或者定位到记录的地址,那么对于底层的操作系统来说,可以直接使用地址定位到数据区域则是非常高效的处理方式。
我们知道索引针对低区别度的字段(包含很多重复值的字段)是没有任何优势的(有一个例外就是某个值可选性高并经常作为条件查询)。所以这种情况下往往在查询的键值对应大量记录的时候,忽略索引并扫描整个表的方式会更加高效。
那么我们在索引上面进行查询的时候,如果能够将其他字段也加到这个索引上面,那么查询所需要的数据完全可以从索引上面找到,则不需要访问原始的数据表,减少IO操作,查询效率将大大提高。
IOT的设计原则是在索引中尽量多存储数据,其目的就是为了避免查询中同时检索Index 以及表字段,只需要定位到索引即可完成整个查询的目的,从而提高查询的效率。
如果将所有的字段都加入到主键索引中,那么就不需要再建立原始表,既节省了空间,也可以节省时间,这样的表在Oracle中就是索引组织表(Index-Oganization Table. IOT)。IOT继承了索引的特性,具有排序结构,所有的记录在内部已经完成排序,对于范围搜索来说非常有利,但对于非范围搜索则需要进行范围扫描。这种方式的索引在SQL Server和Sybase中称之为Clustered Index(聚簇索引),DB2中则称之为Clustering Index。
这类型的表在数据更新操作中则会增加不少开销,因为更新操作会导致记录的重新排序,由此而引起数据的物理存储位置的变动。
但是对于特定的数据库,如果插入记录的时候与主键顺序相同或者相近的情况下,消耗会稍微改观一点。