Android Sqlite / ORMLite中的十六进制字符串vs大整数索引

时间:2014-11-28 23:49:14

标签: android performance orm sqlite android-sqlite

我们在移动设备中存储了大量的十六进制数据(例如:“2D2134F2487B0ACE08B7”),大约有600.000到900.000个条目。

对此的查询非常缓慢......

select id from 'combinations' where token = '2D2134F2487B0ACE08B7' limit 1

将令牌存储为二进制数是否有意义,以便索引比字符串比较快得多?

问题还在于 - 是否可以在sqlite中存储这么大的二进制数?

f.e. 
hex: 2D2134F2487B0ACE08B7
=> "00101101001000010011010011110010010010000111101100001010110011100000100010110111"

我无法找到任何我理解的......:/ 谢谢!

编辑: LOLOL ......我不知道为什么我之前没有意识到...我还可以将十六进制转换为普通整数,这样可以节省很多密钥长度。但无论如何..如果我能在int中保存像“213119049475094085503159”这样的大值,问题仍然存在吗?

2 个答案:

答案 0 :(得分:3)

SQLite的整数不能超过64位。

如果对token编制索引,则查找速度很快。

为节省空间,您可以将值存储为blob:

select id from combinations where token = x'2D2134F2487B0ACE08B7'

(SQLite索引支持所有数据类型。)

答案 1 :(得分:1)

SQLite可以存储的内容NUMBER定义为here

  

该值是有符号整数,存储为1,2,3,4,6或8个字节,具体取决于值的大小。

表示相当于long的值。十六进制长度是

    0102030405060708

这还不够

2D2134F2487B0ACE08B7

所以答案是:不,你不能把它存储为数字。

如果您还没有这样做,请考虑将该列编入索引,因为这会加快您正在进行的查询。请参阅https://www.sqlite.org/queryplanner.html以获得相当不错的解释。