为70万字的Android文字游戏声明SQLite表

时间:2015-08-28 17:46:40

标签: android sqlite android-sqlite android-sql

对于Android文字游戏(minSdkLevel=9表示SQLite版本3.6.22) -

screenshot

我想将字典作为APK文件中的预填充SQLite表格(在SQLiteAssetHelper的帮助下)。

在SQLite数据库中只有一个表:

create table dict (          /* contains 700 000 unique words */
        word text not null
);

我的问题:

如何声明表以获得最佳性能以及使用哪种SQL查询?

(当检查播放器输入的单词是否存在于 dict 表中时 - 这将是应用程序中SQLite数据库的主要用法。)

我应该create index(是否可以为text列添加索引?)

或者我应该将列声明为primary key

此外,一些SQLite for Android guides建议在每个表中都有一个_id列(可能是为了能够获取最后插入的记录? - 我在这里并不需要)。我应该使用

create table dict (
        _id integer primary key,
        word text unique not null
);

create index word_index on dict(word);

还是会浪费4 x 700 000字节? (或者它是否添加为_rowid_?)

1 个答案:

答案 0 :(得分:2)

快速回答:是的,您可以在文本列上创建索引。

但是为了获得最佳性能,这可能不是最佳选择。 因为SQLite创建的索引应该只是一个b树(二叉树),它可以通过二进制搜索加速搜索。即,具有700k字,二进制搜索必须运行大约20个间隔。但这可能足够快,你需要测试它才能真正了解性能。

一些替代方法是创建多个表(桶),例如:将表创建为wordA,wordB,wordC等。 并使用第一个字符来确定单词放在哪个表中。 这会使每个表的大小减少,包含大约27k条记录。 (当然每个桶的大小不一样)

通过这样做,它减少了执行二进制搜索所用的间隔。

实际上你应该使用哈希函数来确定存储桶,这样可以使每个存储桶的大小更加平衡,并且可以自由地控制存储桶的数量。

你必须进行微调才能知道什么是最佳铲斗尺寸。