首页 > 解决方案 > 在电话上使用带有 GUID 数据的字符串或使用具有 20,000 行的 SQLite 表的 int 之间的性能损失?

问题描述

我有一个应用程序,该应用程序当前正在使用填充了 GUID 的字符串作为 SQLite 表上的 PrimaryKey 列,其中包含 20,000 行:

public class Phrase
{
    [PrimaryKey, NotNull]
    public string PhraseId { get; set; }
    public int PhraseNum { get; set; }
    ...
}

我的问题是,对于电话应用程序,您认为不使用当前是 GUID 的 PhraseId 而是使用 PhraseNum 作为 PrimaryKey 是个好主意吗?请注意,我通过 PhraseId 做了很多查找。

在此处输入图像描述

标签: sqlitexamarinxamarin.forms

解决方案


通常最好使用数字,甚至更好地将数字作为 rowid 的别名。

rowid 表的数据存储为 B-Tree 结构,其中每个表行包含一个条目,使用 rowid 值作为键。这意味着按 rowid 检索或排序记录很快。搜索具有特定 rowid 的记录或具有指定范围内的 rowid 的所有记录的速度大约是通过指定任何其他 PRIMARY KEY 或索引值进行的类似搜索的两倍。

ROWID 和整数主键

您仍然可能有一个索引(使列 UNIQUE 会自动生成一个索引)。

因此,您很可能最好使用:-

public class Phrase
{
    [PrimaryKey, NotNull]
    public int PhraseNum { get; set; }
    public string PhraseId { get; set; }

    ...
} 
  • 注意不要使用AUTOINCREMENT会降低性能。

推荐阅读