SQLITE:有关使用AUTOINCREMENT的最佳实践

时间:2018-10-08 11:04:48

标签: performance sqlite rowid

根据official manual

“ AUTOINCREMENT关键字强加了额外的CPU,内存,磁盘空间和磁盘I / O开销,如果不是严格需要,则应避免使用。通常不需要。”

所以最好不要使用它?您是否有使用隐式rowid相对于AUTOINCREMENT的基准测试?

1 个答案:

答案 0 :(得分:2)

按照文档中的建议,最好不要使用AUTOINCREMENT,除非您需要确保 rowid 的别名(又名id)大于已添加的别名。但是,(在正常使用中)这是一个有争议的问题,即使没有AUTOINCREMENT,直到达到9223372036854754775807行之后,也会产生更高的rowid / id。

如果确实达到了9223372036854754775807的id / rowid,那么如果您已对AUTOINCREMENT进行了编码,就是这样,因为将发生SQLITE_FULL异常。如果没有AUTOINCREMENT,将尝试获取未使用的id / rowid。

AUTOINCREMENT向sqlite_sequence添加一行(如果需要的话,表),该行记录分配的最高ID。使用和不使用AUTOINCREMENT的区别在于,引用了sqlite_sequecence表,而没有使用AUTOINCREMENT的情况下则不引用。因此,如果删除具有最高ID的行,则AUTOINCREMENT从sqlite_sequence表中获得有史以来分配的最高ID(并且用户使用该ID或max(rowid)中的较大者),而没有这样做,则它使用表中的最高ID该行将被插入(相当于max(rowid))。

根据有限的测试,What are the overheads of using AUTOINCREMENT for SQLite on Android? 的开销为8-12%。