首页 > 代码库 > SQLite 使用AUTOINCREMENT带来的利弊

SQLite 使用AUTOINCREMENT带来的利弊

  在项目使用中我们常常需要一个自动增长的主键,比如加上AUTOINCREMENT约束使一个主键在每次插入数据时增长。由于一般而言你建立一个表会默认有一个成为ROWID的字段(除非声明为 without rowid),所以你添加的integer primary key其实就是rowid的别名而已,但是如果你加了autoincrement的约束以后,数据库引擎生成rowid的算法会发生相应的改变。

他们的生成算法如下

  integer primary key:

        获取当前column最大的值,如果没有达到64位有符号整数最大值,那么就在最大值的基础上+1作为新值 ,如果已经达到了最大值,那么就重新随机寻找一个未使用的,就是你删除一行的时候未用的那个值。如果真的已经没有可以插入了,那么就返回SQLITE_FULL错误。

 integer primary key autoincrement:

      获取当前column最大值,如果没达到最大值,增1插入,否则返回SQLITE_FULL。

integer primary key默认也是会自动增加的,使用autoincrement能够保证新插入的数据一定会比以前的大,但是也带来了许多额外的消耗,会消耗额外的CPU,磁盘空间,还有I/O磁盘操作带来的开销。官网给出的建议是:如果没有严格的需要它应当被避免使用,通常它不是必要的。


  下面是我测试的一些数据:

insert操作
关闭事物处理
100W数据 not autoincrement 74.7088160515 s
100W数据 autoincrement  91.2676999569 s
开启事物处理
100W数据 not autoincrement 69.6123759747 s
100W数据 autoincrement 86.1955218315 s




SQLite 使用AUTOINCREMENT带来的利弊