假设我们的文件只有一个名为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数据?
答案 0 :(得分:0)
在SQLite中,表行按内部rowid column的顺序存储。 因此,索引必须单独存储。
在SQLite 3.8.2或更高版本中,您可以创建一个WITHOUT ROWID表,该表按主键值的顺序存储。