32

在 SQLite 数据库中将文本作为主键是不是很糟糕?我听说由于性能原因这很糟糕,这是真的吗?在这种情况下,rowid 会被用作实际的主键吗?

4

5 回答 5

47

在 SQLite 数据库中将文本作为主键是不是很糟糕?我听说由于性能原因这很糟糕,这是真的吗?

从正确性的角度来看,TEXT PRIMARY KEY是可以的。

从性能的角度来看,更喜欢INTEGER按键。但与任何性能问题一样,请自行测量,看看您的数据和用例是否存在显着差异。

在这种情况下,rowid 会被用作实际的主键吗?

INTEGER PRIMARY KEYROWID. WITHOUT ROWID其他类型的主键没有,除非指定,否则会有隐式整数 rowid 。参考

于 2014-04-18T20:06:24.513 回答
29

在现实世界中,如果我们谈论 UUID,使用字符串作为主键有很多好处。能够在创建实体“护照”时准确地创建它可以大大简化异步代码和/或分布式系统(如果我们谈论的是更复杂的移动客户端/服务器架构)。

至于性能,我在运行基准以执行 10000 次主键查找时没有发现任何可测量的差异,因为实际上,数据库索引在运行索引搜索时既不存储也不比较字符串。

于 2017-08-21T23:28:02.863 回答
-1

是的,如果你使用 TEXT 你会得到 android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: TableName.ColumnName (code 1555)

如果此插入成功,SQLite 具有插入会话并返回插入的最后一行的行 ID。否则将返回-1。

return 映射到 _ID ,这就是他们强制您为表连接 BaseColumns 的原因

奇怪的是插入调用必须返回rowid,而不是布尔值

我希望 SQLite 中有 TEXT PRIMARY KEY 功能

于 2018-12-04T02:01:13.130 回答
-3

PRIMARY KEY 类型的字段意味着比较值。比较数字比比较文本更简单。

原因是64 位数值比较有特定的汇编指令。这总是比比较理论上可以无限大小的文本快得多。

比较数字的示例:

CMP DX, 00  ; Compare the DX value with zero
JE  L7      ; If yes, then jump to label L7
.
.
L7: ...

在此处阅读有关CMP组装说明的更多信息:https ://www.tutorialspoint.com/assembly_programming/assembly_conditions.htm

知道这一点让我们知道数字总是更具表现力(至少在我们今天拥有的计算中)。

于 2019-11-16T04:51:37.857 回答
-37

在 SQLite 数据库中将文本作为主键是不是很糟糕?我听说由于性能原因这很糟糕,这是真的吗?

我从未听说有人使用字符串作为表中的主键。对我来说(老实说,我也希望对其他人)非常“丑陋”的做法,性能非常低。

如果您将使用字符串作为主键,则需要考虑“一些”事情:

  • 3个符号的组合就够了吗?
  • 还是应该使用 5 个符号?

在这里,每一行必须具有相同的格式(当然是可读性问题)并且也是唯一的。哦!这是下一个“小猪工作” ->,您需要创建一些“唯一字符串生成器”,它将生成唯一的1字符串标识符2

还有下一个问题值得考虑:

  • 更长的字符串=会自动变得越来越难比较
  • 表格的大小急剧增加,因为很明显字符串的大小比数字大得多
  • 行数 - 如果你的表可以有 1000 多行,那么使用字符串作为主键是很疯狂的

这是更复杂的主题,但我想说好的,对于非常小的表可以使用字符串作为主键(如果它有意义的话)但是如果你会看到缺点,那么使用数字作为更好的技术肯定是主键!

什么是结论?

我不建议您使用字符串作为主键。它有更多的缺点作为优点(它真的有一些优点吗?)。

使用数字作为主键要好得多(我不敢说是最好的)实践。

在这种情况下,rowid 会被用作实际的主键吗?

如果您将字符串用作主要不是。

1在实际中,字符串很少是唯一的。

2当然,您可以说您可以从行中的项目名称创建标识符,但这又是意大利面条代码(项目可以具有相同的名称)。

于 2014-04-18T20:07:34.717 回答