首页 > 解决方案 > SQLITE:关于使用 AUTOINCREMENT 的最佳实践

问题描述

根据官方手册

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

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

标签: performancesqliterowid

解决方案


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

如果你确实达到了 9223372036854775807 的 id/rowid,那么如果你有 AUTOINCREMENT 编码,那就是它,因为会发生 SQLITE_FULL 异常。虽然没有 AUTOINCREMENT 会尝试获取未使用的 id/rowid。

AUTOINCREMENT 向 sqlite_sequence 添加一行(如果需要,则为表),记录最高分配的 id。有和没有 AUTOINCREMENT 的区别在于 sqlite_sequecence 表被引用,而没有 AUTOINCREMENT 则不是。因此,如果删除了具有最高 id 的行 AUTOINCREMENT 会从 sqlite_sequence 表中获得最高分配的 id (并且用户使用该或中的较大者max(rowid)),但不会使用正在插入该行的表中的最高值(相当于max(rowid))。

根据在 Android 上使用 AUTOINCREMENT for SQLite 的开销是多少,通过有限的测试,发现 8-12% 的开销是开销? .


推荐阅读