sqlite3 - 这个场景的sqlite设计背后的哲学

时间:2014-07-04 14:11:36

标签: sqlite

假设我们的文件只有一个名为TableA的表,而且该表只有一个名为Text的列; 假设我们使用3,000,000个这样的字符串填充我们的TableA每行记录):

Many of our patients are incontinent.
Many of our patients are severely disturbed.
Many of our patients need help with dressing.

如果我将文件保存在此级别,它将是: ~326 MB

现在假设我们想提高查询速度,因此我们将Text列设置为PrimaryKey(或创建索引);

如果我将文件保存在此级别,它将是: ~700 MB

我们的查询:

SELECT Text FROM "TableA" where Text like '% home %'

表没有索引: ~5.545s

索引表的

~2.231s

据我所知,当我们在列上创建索引或将列设置为我们的PrimaryKey时,sqlite引擎不需要引用表本身(如果查询中没有请求其他列)并且它使用索引用于查询,因此查询执行速度提高;

我的问题是在上面的场景中,我们只有一个列并将该列设置为PrimaryKey,那么为什么sqlite会保存某种不必要的数据?(至少看起来没必要!)(在这种情况下 ~326 MB )为什么不保留索引\ PrimaryKey数据?

1 个答案:

答案 0 :(得分:0)

在SQLite中,表行按内部rowid column的顺序存储。 因此,索引必须单独存储。

在SQLite 3.8.2或更高版本中,您可以创建一个WITHOUT ROWID表,该表按主键值的顺序存储。