对于Android文字游戏(minSdkLevel=9
表示SQLite版本3.6.22) -
我想将字典作为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_
?)
答案 0 :(得分:2)
快速回答:是的,您可以在文本列上创建索引。
但是为了获得最佳性能,这可能不是最佳选择。 因为SQLite创建的索引应该只是一个b树(二叉树),它可以通过二进制搜索加速搜索。即,具有700k字,二进制搜索必须运行大约20个间隔。但这可能足够快,你需要测试它才能真正了解性能。
一些替代方法是创建多个表(桶),例如:将表创建为wordA,wordB,wordC等。 并使用第一个字符来确定单词放在哪个表中。 这会使每个表的大小减少,包含大约27k条记录。 (当然每个桶的大小不一样)
通过这样做,它减少了执行二进制搜索所用的间隔。
实际上你应该使用哈希函数来确定存储桶,这样可以使每个存储桶的大小更加平衡,并且可以自由地控制存储桶的数量。
你必须进行微调才能知道什么是最佳铲斗尺寸。