SQLITE如何选择表类型

Sqlite中表类型主要有普通表,以及WITHOUT ROWID表以及临时表。临时表一般是是查询需要临时存储结果使用。这篇文章主要讨论普通表和WITHOUT ROWID表的区别,以及AUTOINCREMENT的特性。

1.rowid的类型是什么?

sqlite中rowid是一个隐身存储的列,8个字节存储,它有两个别名 _ROWID_ 和 OID,类型定义为INTEGER PRIMARY KEY,因此当用户建表时,某列定义为 INTEGER PRIMARY KEY,实质是rowid的别名。rowid是自增的,当该列插入null时, 会取当前表的最大值+1,作为该列的值。注意INTEGER与int不同,比如若列定义为 int primary key, 则插入null值,该列的值就是null,rowid依然会递增。查询可以通过select rowid from tablename得到rowid的值。

2.INTEGER PRIMARY KEY AUTOINCREMENT 和不指定自增长字段用rowid区别?

1)   AUTOINCREMENT属性只能用于定义为INTEGER PRIMARY KEY的列,否则建表时会报错。

2)   不使用自增 长的rowid始终取当前最大值+1,若删除了最大rowid所在的记录,导致这个rowid会重用。 采用AUTOINCREMENT属性可以避免重用情况,系统内部通过sqlite_sequence表来维护每个表的最大sequence值, 因此即使有删除情况,也不会导致rowid重用,严格单调递增,代价时执行插入时, 需要维护sqlite_sequence表,对性能有一定的损耗。 由于rowid采用8个字节存储,因此上限值为9223372036854775807,当超过这个值时,rowid属性会随机选择一个值, 只要不与表中已有记录冲突即可;而AUTOINCREMENT属性则会提示Error: database or disk is full。

3)   vacuum命令与rowid

网上有文章说使用vacuum命令,会导致rowid重新分配使用,比如原来rowid是1,3,5的3条记录,经过vacuum后, 会重组为1,2,3。本人亲自测试后,并没有重现。

3.WITHOUT ROWID

1) 普通表的PRIMRAY KEY实质是一个唯一索引,表数据按rowid组织(聚集索引), 通过主键访问表,实质需要访问唯一索引和聚簇索引,但对于INTEGER PRIMARY KEY除外, 它是rowid的一个别名,索引实质就是聚簇索引。

2)  B树,B-树,B+树,B*树有啥区别? B树是二叉查找树,B代表binary;而后面的B-,B+,B*则代表balance。在数据库领域讨论的B树,都注意是后面三种。 从数据结构来说,B-树中叶子节点和非叶子节点内容结构相同,查找可能在非叶子节点找到数据,直接返回;而B+树中,每 一次查找都需要找到叶子节点,key信息在叶子节点和非叶子节点存储了两遍,叶子节点包含了所有key信息,并且节点之间 有双向指针相连;B*树相对于B+树区别是非叶子节点兄弟之间也有双向指针相连。

3)  WITHOUT ROWID采用B-Tree,叶子节点和非叶子节点都有记录所有内容, 因此若记录较长(超过page_size*1/20),不适合使用WITHOUT ROWID属性, 容易造成节点频繁分裂。WITHOUT ROWID 表只有一颗B-树,访问只需要访问一次B-树, 而普通表需要访问两次(索引+表),对于INTEGER PRIMARY KEY除外。

4) WITHOUT ROWID不支持AUTOINCREMENT属性,并且PRIMARY KEY不能为null,普通表比较变态,PRIMARY KEY 属性列也可以为null(由于历史原因,没有修改)。

4.如何选择表类型?

1)   若主键为整型,采用普通表,将列定义为INTEGER PRIMARY KEY,这样保证只有只有1颗B*树,提高查询效率;

2)   若主键为非整型,记录比较小(不超过page_size*1/20),并且不依赖于rowid的逻辑序号,可以考虑使用WITHOUT ROWID表,节省空间 的同时,提高查询效率

3)   其它情况,则使用普通表,定义主键。

时间: 2024-08-09 02:19:47

SQLITE如何选择表类型的相关文章

表类型(存储引擎)的选择

表类型(存储引擎)的选择 插件式存储引擎是MySQL数据库最重要的特性之一,用户可以依据应用的需要选择如何存储和索引数据.是否使用事务等. MySQL5.0支持的存储引擎包括MyISAM.InnoDB.BDB.MEMORY.MERGE.EXAMPLE.NDB Cluster.ARCHIVE.CSV.BLACKHOLE.FEDERATED等,其中InnoDB和BDB提供事务安全表,其他存储引擎提供非事务安全表. 默认情况下,创建新表不指定表的存储引擎,则新表是默认存储引擎,如果需要修改,设置def

Sqlite如何修改表结构字段类型

SQLite 仅仅支持 ALTER TABLE 语句的一部分功能,我们可以用 ALTER TABLE 语句来更改一个表的名字,也可向表中增加一个字段(列),但是我们不能删除一个已经存在的字段,或者更改一个已经存在的字段的名称.数据类型.限定符等等. 改变表名 - ALTER TABLE 旧表名 RENAME TO 新表名 增加一列 - ALTER TABLE 表名 ADD COLUMN 列名 数据类型 而修改一列无法像其他数据库那样直接以“ALTER TABLE 表名 ADD COLUMN 列名

《深入浅出Mysql》——第二篇 开发篇 第七章 表类型(存储引擎)的选择

和大多数数据库不同,MySQL 中有一个存储引擎的概念,针对不同的存储需求可以选择最 优的存储引擎.本章将详细介绍存储引擎的概念.分类以及实际应用中的选择原则. 插件式存储引擎是 MySQL 数据库最重要的特性之一,用户可以根据应用的需要选择如 何存储和索引数据.是否使用事务等.MySQL 默认支持多种存储引擎,以适用于不同领域 的数据库应用需要,用户可以通过选择使用不同的存储引擎提高应用的效率,提供灵活的存 储,用户甚至可以按照自己的需要定制和使用自己的存储引擎,以实现最大程度的可定制性. 查

Android程序员必掌握的sqlite数据库连表查询

SQL查询的基本原理:两种情况介绍. 第一.   单表查询:根据WHERE条件过滤表中的记录,形成中间表(这个中间表对用户是不可见的):然后根据SELECT的选择列选择相应的列进行返回最终结果. 第二.   两表连接查询:对两表求积(笛卡尔积)并用ON条件和连接连接类型进行过滤形成中间表:然后根据WHERE条件过滤中间表的记录,并根据SELECT指定的列返回查询结果. 第三.   多表连接查询:先对第一个和第二个表按照两表连接做查询,然后用查询结果和第三个表做连接查询,以此类推,直到所有的表都连

Android程序猿必掌握的sqlite数据库连表查询

SQL查询的基本原理:两种情况介绍. 第一.   单表查询:依据WHERE条件过滤表中的记录,形成中间表(这个中间表对用户是不可见的):然后依据SELECT的选择列选择对应的列进行返回终于结果. 第二.   两表连接查询:对两表求积(笛卡尔积)并用ON条件和连接连接类型进行过滤形成中间表:然后依据WHERE条件过滤中间表的记录,并依据SELECT指定的列返回查询结果. 第三.   多表连接查询:先对第一个和第二个表依照两表连接做查询,然后用查询结果和第三个表做连接查询,以此类推,直到全部的表都连

sqlite学习笔记8:C语言中使用sqlite之创建表

前面已经说了如何打开和关闭数据库,这次要说得是如何执行SQL语句,来创建一张表. 要用的的函数: sqlite3_exec(sqlite3* db, const char *sql, sqlite_callback callback, void *data, char **errmsg) 参数: db:已经打开的数据库实例 sql:SQL语句,是一个字符串 callback:是一个回调函数 data:做为回调函数的第一个参数 errmsg:用于带回错误信息 该回调函数有两种返回值类型. 1.返回

MySQL表类型MyISAM/InnoDB的区别(解决事务不回滚的问题)(转)

MyISAM:这个是默认类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.与其他存储引擎比较,MyISAM具有检查和修复表格的大多数工具. MyISAM表格可以被压缩,而且它们支持全文搜索.它们不是事务安全的,而且也不支持外键.如果事物回滚将造成不完全回滚,不具有原子性.如果执行大量的SELECT,MyISAM是更好的选择. InnoDB:这种类型是事务安全的.它与BDB类

MySQL表类型

MyISAM表类型: ISAM(Indexed Sequential Access Method,索引顺序存取方法),是IBM公司发展起来的一个文件操作系统,可以连续地或者任意地记录任何访问.每次索引定义了一次不同排列的记录.它是一种索引机制,用于高效访问文件中的数据行. MyISAM表是ISAM类型的一种延伸,具有很多优化和增强的特性,它是MySQL的默认表类型.MyISAM优化了压缩比例和速度,并且可以很方便的在不同的操作系统和平台之间进行移植. HEAP表类型: heap:堆,堆积,大堆阵

MySQL学习笔记之三 表类型

你能用的数据库引擎取决于MySQL在安装时候是如何被编译的.要添加一个新的引擎,就必须编译MySQL.仅仅为了添加一个特性而编译应用程序的想法对于Windows的开发人员来说可能有点小题大做,得不偿失,但是在Unix的世界里,这已经成为了标准.在缺省的情况下,MySQL支持三个引擎:ISAM.MyISAM和HEAP.另外两种类型InnoDB和Berkley(BDB),也常常可以使用. ISAM ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之初就考虑到数据库被查询的次数远远大于