【问题标题】:Hex string vs big int index in Android Sqlite/ORMLiteAndroid Sqlite/ORMLite 中的十六进制字符串与大整数索引
【发布时间】:2014-11-28 23:49:14
【问题描述】:

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

这个查询很慢...

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

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

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

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

我找不到任何我能理解的东西...:/ 谢谢!

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

【问题讨论】:

    标签: android performance orm sqlite android-sqlite


    【解决方案1】:

    SQLite 的整数不能超过 64 位。

    如果token 被索引,查找速度会很快。

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

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

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

    【讨论】:

    • 您认为在 blob 中使用索引查找比在字符串中更快吗?
    • 十六进制字符串使用两倍大小,即需要更多 I/O。
    【解决方案2】:

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

    该值是一个有符号整数,根据值的大小存储在 1、2、3、4、6 或 8 个字节中。

    表示与long 等效的值。十六进制长度为

        0102030405060708
    

    这还不够

    2D2134F2487B0ACE08B7
    

    所以答案是:不,您不能将其存储为数字。

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

    【讨论】:

      猜你喜欢
      • 2013-04-28
      • 1970-01-01
      • 2017-08-07
      • 1970-01-01
      • 2017-08-12
      • 1970-01-01
      • 2013-10-22
      • 2012-01-14
      • 2015-04-30
      相关资源
      最近更新 更多