日期:2014-05-16  浏览次数:20493 次

innodb 存储引擎为什么要用一个自增的主键呢?


?innodb 存储引擎为什么要用一个自增的主键呢?
?
我们来看看innodb的存储,
?
?
每个表在磁盘上,是单独的一个文件。索引和数据都在其中,文件是按照主键索引组织的一个B+TREE结构。
?

?
?
因为B+TREE是有序的一个数据结构,所以从效率的角度,主键最好也是一个有序的,这样可以有效的防止B+TREE的不断分裂调整。同时也保证了按照时间顺序进去的数据在存储上也是一个相对顺序的存放。这个不仅对insert,同时对有时间条件的范围查询,也能大大提高效率。
?
同时mysql 5.1后,对自增的主键的优化也有很多。
?
这种按照索引组织数据的方式,简称IOT,还有一种方式,叫heap table,堆表。
?
这个问题,我发现有两种人特别容易采坑:
1、从Oralce转过来使用MySQL的人。因为Oracle是heap table 和 IOT都实现了,而且默认是按照heap table的方式进行存储。
2、Hibernate的重度使用者。很多早期的Hibernate教程,会建议为了移植数据库方便,会建议主键使用UUID
?
所以,innodb下的表,如果有足够的数据量,毫不怀疑的加一个自增主键。存量系统需要改造的话,在原表上加一个自增主键,原表的主键改成一个唯一索引降格为Secondary Index即可。
?

?