sqlite中寻址空间的实际主键大小

时间:2018-02-08 11:01:43

标签: sql sqlite floating-point precision

我想在sqlite数据库中逐行存储文本文件,需要快速检索行并能够有效地插入行。所以我在考虑使用REAL PRIMARY KEY,根据sqlite Docs是一个双精度浮点数。我的想法是用(previous_line_id+next_line_id)/2作为新的主键插入。

问题:

  1. 我应该如何首先增加密钥(不插入)以最大化可用的地址空间以及在用完精度之前可以插入多少行?

  2. 如果两条线路之间的空间不足,是否有快速重新排序所有真实身份证的方法?

  3. 有更好的方法吗?

  4. 关于3,我确信有更好的专业数据结构,但如果它们有效,我对快速和脏的sqlite解决方案更感兴趣。

1 个答案:

答案 0 :(得分:0)

这不需要浮点数。您要使用的浮点功能是两个行号 a b 之间可以有许多可表示的值。但是这个特征很容易通过整数来获得,只需要通过对它们之间有大间隙的行进行编号。

例如,对于通用的IEEE 754 64位二进制浮点格式,编号行1,2,3,4 ...将在初始行号后提供大约50位(对于1和2之间的数字,为52位) 51表示2到4之间的连续整数,50表示4到8之间的连续整数,依此类推,因为浮点浮点数)。通过使用64位整数0x10000000000000,0x20000000000000,0x30000000000000,0x40000000000000对行进行编号,可以获得类似且更容易理解的效果。然后,您可以根据需要通过插入旧行号在旧行之间插入新行(只需确保算术不会溢出,如果行号太大,它可能会溢出)。

重新编号线的算法很简单,只需指定所需间距的新数字即可。更难的部分是维护数据库一致性 - 如果数字被引用到其他地方,则必须更新引用。但无论行号是整数还是浮点,都是如此。