在SQLite文档中,它包括以下内容: -
AUTOINCREMENT关键字会占用额外的CPU,内存,磁盘空间和 磁盘I / O开销,如果不是严格需要,应该避免。它是 通常不需要。
和
AUTOINCREMENT关键字实现的行为是巧妙的 与默认行为不同。使用AUTOINCREMENT,行 自动选择的ROWID保证具有ROWID 以前从未在同一个数据库中使用同一个表。而且 自动生成的ROWID保证是单调的 越来越多。这些是某些应用中的重要属性。 但是如果你的应用程序不需要这些属性,你应该这样做 可能会保留自使用AUTOINCREMENT以来的默认行为 在插入每一行时需要完成额外的工作 导致INSERT运行得慢一些。
以上引用来自SQLite Autoincrement
那么预期会产生什么样的影响,以及AUTOINCREMENT的速度有多慢?
答案 0 :(得分:2)
我的估计,即我不是统计学家,是开销有点像 8-12%慢。
我使用 3 结构相似且简单的表和两个TEXT列获得了结果,每个表运行 10,000 插入,重复此5 4台设备上的时间。
表1(Dflt列)仅使用两个TEXT列创建(因此使用默认的ROWID)。
除了两个TEXT列之外,还使用_id INTEGER PRIMARY KEY AUTOINCREMENT
创建了表2(AI列)。
除了两个TEXT列之外,还使用_id INTEGER PRIMARY KEY
创建了表3(无AI列)。
所以表2 使用稍微不同的ROWID选择算法进行插入。
使用的四种设备是: -
(1)Genymotion仿真设备(自定义平板电脑 - 5.1.0 - API 22 - 1536x2048 )
(2)Onix 10"平板电脑(AT101-1116 )
(3)HTC 1 M8(HTC_0PKV1 )
(4)Lenevo A10-30平板电脑(Lenovo TB2-X30F )
我获得的结果是: -
当所有内容仅在1个事务中运行时(即beginTransaction();
之前的任何插入,在所有插入之后setTransactionSuccessful();
和endTransaction();
(对于所有表,即整个150,000),结果更有利插入),例如: -
两个表的比较,突出了使用事务可以对性能产生的好处。