为 Android 700 000 个单词的文字游戏声明 SQLite table

Declaring SQLite table for Android word game with 700 000 words

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

我想在 APK 文件中以预填充 SQLite table 的形式提供字典(在 SQLiteAssetHelper 的帮助下)。

在 SQLite 数据库中只有 1 table:

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

请问我的问题:

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

(检查玩家输入的单词是否出现在 dict table 中 - 这将是 SQL 的主要用途应用程序中的项目数据库)。

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

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

此外,一些 SQLite for Android guides 建议在每个 table 中有一个 _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_?)

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

然而,为了获得最佳性能,这可能不是最佳选择。 因为SQLite创建的索引应该是简单的b-tree(二叉树),通过二分查找来加快查找速度。即对于 700k 个单词,二进制搜索必须 运行 大约 20 个间隔。但这可能已经足够快了,您需要对其进行测试才能真正了解性能。

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

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

而实际上应该使用hash函数来确定bucket,这样可以使每个bucket的大小更加均衡,可以自由控制bucket的个数。

而且您必须实际微调才能知道什么是最佳存储桶大小。