SQLite主键与RowID的是什么关系?

SQLite主键与RowID的是什么关系?,第1张

默认情况下,SQLite会自动存在一个RowID列,从1开始,每添加一条记录+1

设置了主键,而且主键的类型为integer时,查询RowID等于主键

主键设置为integer时,对rowid和主键的查询情况

create table aaa(id integer PRIMARY KEY,aaa ntext)

只有在设置为Integer时才会替代rowid,设置为int或其它都不行,下图为主键设置成int类型

create table aaa(id int PRIMARY KEY,aaa ntext)

写入效率对比:

插入500W记录,不设置主键,利用rowid,写入时间1分13秒

插入500W记录,设置Integer主键,写入时间1分19秒

检索效率对比:

对设置了integer主键的表,查询主键100W次,耗时1分20秒

对设置了integer主键的表,查询rowid 100W次,耗时1.22秒

对不设置主键的表,查询rowid 100W次,耗时1.23秒

(这2秒左右的差距,判断有两种可能,第一是程序运行时误差,第二种可能是因为主键是ID,比rowid长度小,所以拼接sql语句时,要占时间优势)

检索优化:

每次检索对command赋值,耗时约1分20秒

[csharp]

SQLiteCommand cmd = new SQLiteCommand(conn)

for (int i = 0i <1000000i++)

{    www.2cto.com

cmd.CommandText = "select * from aaa where id=" + (1000000 + i)

cmd.ExecuteNonQuery()

}

每次检索对参数赋值,耗时约58秒

[csharp]

SQLiteCommand cmd = new SQLiteCommand(conn)

cmd.CommandText = "select * from aaa where id=@id"

cmd.Parameters.Add("id", DbType.Int32)

for (int i = 0i <1000000i++)

{    www.2cto.com

cmd.Parameters[0].Value = (1000000 + i)

cmd.ExecuteNonQuery()

}

id int identity(1,1) 是 SQL Server 的 自动递增列的写法。\x0d\x0a\x0d\x0a对于SQLite\x0d\x0a主键数据类型为 int 类型。 \x0d\x0a插入的时候,不传入数据, 就是默认为自动递增处理。 \x0d\x0alast_insert_rowid() 函数用于获取最新生成的 ID\x0d\x0a\x0d\x0asqlite>CREATE TABLE test_create_tab2 (\x0d\x0a ...> id integer,\x0d\x0a ...> val VARCHAR(10),\x0d\x0a ...> PRIMARY KEY (id)\x0d\x0a ...>)\x0d\x0asqlite> INSERT INTO test_create_tab2(val) VALUES ('NO id')\x0d\x0asqlite>select last_insert_rowid()\x0d\x0alast_insert_rowid()\x0d\x0a1\x0d\x0a\x0d\x0asqlite>INSERT INTO test_create_tab2(val) VALUES ('NO id 2')\x0d\x0asqlite>select last_insert_rowid()\x0d\x0alast_insert_rowid()\x0d\x0a2\x0d\x0a\x0d\x0asqlite>select * from test_create_tab2\x0d\x0aid|val\x0d\x0a1|NO id\x0d\x0a2|NO id 2\x0d\x0a\x0d\x0asqlite>INSERT INTO test_create_tab2(id, val) VALUES (100, 'id is 100')\x0d\x0asqlite>INSERT INTO test_create_tab2(val) VALUES ('NO id again')\x0d\x0asqlite>select * from test_create_tab2\x0d\x0aid|val\x0d\x0a1|NO id\x0d\x0a2|NO id 2\x0d\x0a100|id is 100\x0d\x0a101|NO id again\x0d\x0a\x0d\x0a注意:\x0d\x0a对于无主键的表\x0d\x0aSQLite 中还有一个 伪列 rowid, 可以作为自动递增的查询处理。\x0d\x0a \x0d\x0asqlite>CREATE TABLE test_create_tab3 (\x0d\x0a ...> id integer,\x0d\x0a ...> val VARCHAR(10)\x0d\x0a ...>)\x0d\x0asqlite>\x0d\x0asqlite>INSERT INTO test_create_tab3(id, val) VALUES (1, 'Test1')\x0d\x0asqlite>INSERT INTO test_create_tab3(id, val) VALUES (2, 'Test2')\x0d\x0asqlite>INSERT INTO test_create_tab3(id, val) VALUES (100, 'Test100')\x0d\x0asqlite>INSERT INTO test_create_tab3(id, val) VALUES (101, 'Test101')\x0d\x0asqlite>select rowid, id, val from test_create_tab3\x0d\x0arowid|id|val\x0d\x0a1|1|Test1\x0d\x0a2|2|Test2\x0d\x0a3|100|Test100\x0d\x0a4|101|Test101


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11377376.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存