有时候我们常常为了使用方便,省略建主键的建表方式。
因为很多时候,这些数据来自于外部,而且数量和增长不会很大。
比如是一些存储过程刷新出来的结果集。
那么我们就会建一个堆表。什么是堆表?
就是没有主键,也没有索引的表。
堆表在创建以后,数据库会以最快地速度把数据插入到磁盘中。在这个过程中,会产生磁盘碎片,数据分散的情况。
这样会大大地降低数据密度。
什么意思呢?
就是说在SELECT表T,要扫描扇区A的时候,只有10%的数据是表T的,但是为了那10%的数据,要扫描多90%不必要的数据。
我们不介意搜索引擎对表T进行全表扫描,但是数据碎片化对于数据库性能,还有磁盘性能都有很大的隐患。
所以,无论什么样的表,都要做成聚簇表,索引表。
也就是有索引,有主键的表。
稍微对比一下堆表和索引表
堆表(heap table)数据插入时时存储位置是随机的,主要是数据库内部块的空闲情况决定,获取数据是按照命中率计算,全表扫表时不见得先插入的数据先查到。
索引表(iot)数据存储是把表按照索引的方式存储的,数据是有序的,数据的位置是预先定好的,与插入的顺序没有关系。
索引表的查询效率逼堆表高(相当于查询索引的效率),插入数据的速度比堆表慢。