SQLite 主键、RowID关系
来源:互联网 发布:初中学学士后java 编辑:程序博客网 时间:2024/06/10 22:20
默认情况下,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秒
SQLiteCommand cmd = new SQLiteCommand(conn); for (int i = 0; i < 1000000; i++) { cmd.CommandText = "select * from aaa where id=" + (1000000 + i); cmd.ExecuteNonQuery(); }
每次检索对参数赋值,耗时约58秒
SQLiteCommand cmd = new SQLiteCommand(conn); cmd.CommandText = "select * from aaa where id=@id"; cmd.Parameters.Add("id", DbType.Int32); for (int i = 0; i < 1000000; i++) { cmd.Parameters[0].Value = (1000000 + i); cmd.ExecuteNonQuery(); }
SQLite文件大小:
大小基本保持一致(但我发现不设置主键,添加一个ID字段为int时,文件大小也是一样的,猜测可能是SQLite预留的B Tree的空间)
结论:
不管是使用rowid还是自定义主键,查询效率基本相同,写入效率使用独立主键要损失大约8%的效率,不过好处是可以自己管理主键的内容
- SQLite 主键、RowID关系
- 不建议使用rowid作为sqlite主键
- SQLite 使用主键,ROWID 及自增列
- sqlite自增:ROWID
- SQLite之rowid与sqlite3_last_insert_rowid()
- SQLite数据库中rowid使用
- sqlite的 主键生成
- sqlite 自增主键
- Sqlite 主键自动创建
- sqlite 主键设定方法
- SQLite 设置主键
- Sqlite 主键自动创建
- SQLite主键自增
- 浅谈rowid和性能优化的关系
- Rowid
- ROWID
- rowid
- ROWID
- QQHelper:QQ大家来找茬 辅助工具 外挂
- java程序实现md5加密功能(2)
- HDU 4286 Data Handler (splay tree || 双向链表模拟)
- 电子书格式问题的本质
- android WebView总结(转)
- SQLite 主键、RowID关系
- PendingIntent 用法深入理解
- uboot命令添加过程
- WEB Apache漏洞扫描
- iometer测试是服务器硬盘的IO性能
- 逆波兰式也就是后缀式 简单介绍
- vim正则表达式
- 2012年ECCV action recognition文章及网址
- Java实践(六)——构造方法与方法重载