虽然本帖讨论的是INTEGER与TEXT主键,但上下文请参见2021年前后的Blob vs. Text for primary keys,SQLite创建者 Richard Hipp 回复了这篇文章。我已经粘贴并***强调了***他回复的相关部分。 (2)作者:Richard Hipp(drh)于2021-03-04 16:00:22回复1 [来源] 这两种方法都可以很好地工作,将散列存储为BLOB可能会稍微快一些,因为(正如您所观察到的)内容较少,因此文件I/O也较少。 化石版本控制系统做的事情与此非常相似。但是它将哈希值存储为***文本而不是blob。性能不是问题,而且文本对于开发人员来说在调试时更容易处理。***
6条答案
按热度按时间pgvzfuti1#
在SQLite数据库中使用文本作为主键是不是很糟糕?我听说这是因为性能原因,是真的吗?
从正确性的Angular 来看,
TEXT PRIMARY KEY
是正确的。从性能的Angular 来看,首选
INTEGER
键,但是对于任何性能问题,您都应该自己测量一下,看看您的数据和用例是否有显著的差异。在这种情况下,rowid是否将用作实际的主键?
只有
INTEGER PRIMARY KEY
可以使用ROWID
的别名,其他类型的主键不会,并且除非指定WITHOUT ROWID
,否则会有隐式整数rowid。参考。4bbkushb2#
在真实的世界中,如果我们讨论UUID,使用字符串作为主键有很多好处。能够在创建实体“passport”的那一刻准确地创建它可以极大地简化异步代码和/或分布式系统(如果我们讨论的是更复杂的移动的客户端/服务器架构)。
至于性能,当运行基准测试来执行10000次主键查找时,我没有发现任何可测量的差异,因为实际上,数据库索引在运行索引搜索时既不存储也不比较字符串。
8hhllhi23#
虽然本帖讨论的是INTEGER与TEXT主键,但上下文请参见2021年前后的Blob vs. Text for primary keys,SQLite创建者 Richard Hipp 回复了这篇文章。我已经粘贴并***强调了***他回复的相关部分。
(2)作者:Richard Hipp(drh)于2021-03-04 16:00:22回复1 [来源]
这两种方法都可以很好地工作,将散列存储为BLOB可能会稍微快一些,因为(正如您所观察到的)内容较少,因此文件I/O也较少。
化石版本控制系统做的事情与此非常相似。但是它将哈希值存储为***文本而不是blob。性能不是问题,而且文本对于开发人员来说在调试时更容易处理。***
v1l68za44#
是的,如果您使用TEXT,则会获得android. database. sqlite. SQLiteConstraintException:UNIQUE约束失败:表名称.列名(代码1555)
SQLite有会话要插入,如果插入成功,则返回插入的最后一行的行ID。否则将返回-1。
returnMap到_ID,这就是为什么他们强制您为表接口BaseColumns
奇怪是,insert调用必须返回rowid,而不是布尔值之类的值
我希望SQLite中有文本主键功能
w1jd8yoj5#
PRIMARY KEY类型的字段意味着比较值。比较数字比比较文本简单。
原因是有一个专门的汇编指令用于64位数字比较。这将总是比比较文本快得多,因为理论上文本的大小可以是无限的。
比较编号示例:
在此处阅读更多关于
CMP
汇编指令的信息:https://www.tutorialspoint.com/assembly_programming/assembly_conditions.htm了解这一点可以让我们知道数字总是更具表演性(至少在我们今天的计算中)。
db2dz4w86#
在SQLite数据库中使用文本作为主键是不是很糟糕?我听说这是因为性能原因,是真的吗?
我从来没有听说过有人用 * 字符串作为表中的主键。对我来说(我真诚地希望其他人也是如此)非常**"丑陋"的实践**性能非常低。
如果你使用字符串作为主键,你需要考虑一些事情:
在这里,每一行必须具有相同的格式(当然是可读性问题),并且是唯一的。哦!下面是 "小Pig工作"
->
,您需要创建一些 "唯一字符串生成器",它将生成unique 1字符串标识符2。而且还有下一个问题是很好的考虑:
=
自动变得越来越难以比较这是一个更复杂的主题,但我想说,好吧,对于非常小的表将有可能使用字符串作为主键(如果它有意义),但如果你会看看缺点,这是更好的技术使用数字作为主键肯定!
我不推荐你用字符串作为主键。它有更多的缺点作为优点(它真的有一些优点?)
使用数字作为主键要好得多(我不敢说是最好的)。
在这种情况下,rowid是否将用作实际的主键?
如果你将使用字符串作为主要的非。
1在实数中,字符串很少是唯一的。
2当然,您可以说您可以从row中的项的名称创建标识符,但这又是意大利面代码(项可以具有相同的名称)。