sqlite - 在电话上使用带有 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 做了很多查找。
解决方案
通常最好使用数字,甚至更好地将数字作为 rowid 的别名。
rowid 表的数据存储为 B-Tree 结构,其中每个表行包含一个条目,使用 rowid 值作为键。这意味着按 rowid 检索或排序记录很快。搜索具有特定 rowid 的记录或具有指定范围内的 rowid 的所有记录的速度大约是通过指定任何其他 PRIMARY KEY 或索引值进行的类似搜索的两倍。
您仍然可能有一个索引(使列 UNIQUE 会自动生成一个索引)。
因此,您很可能最好使用:-
public class Phrase
{
[PrimaryKey, NotNull]
public int PhraseNum { get; set; }
public string PhraseId { get; set; }
...
}
- 注意不要使用
AUTOINCREMENT
会降低性能。
推荐阅读
- angular - 处理 Angular 组件之间的事件
- java - 没有生成值的休眠/JPA OneToOne 共享密钥
- html - 在不指定高度的情况下垂直对齐跨度标签中的文本?
- windows - 了解延迟过程调用 (DPC)
- sed - 使用 sed 仅替换一个实例
- java - how do i fetch derived/calculated column from database view or Procedure in Spring Boot using JPA/Hibernate and use it along with predefined columns?
- swift - 使用 Apples CryptoKit 在 iOS 和 Kotlin/Java 之间进行跨平台 AES 加密
- javascript - Stuck with Modal creation (Javascript and HTML)
- postgresql - Docker/PostgreSQL 使用 pgadmin4 创建服务器并遇到用户问题
- python - TypeError: list indices must be integers, not RowProxy