Шестнадцатеричная строка против большого индекса int в Android Sqlite/ORMLite

Мы храним много шестнадцатеричных данных на наших мобильных устройствах (например, "2D2134F2487B0ACE08B7"), около 600 000–900 000 записей.

Запрос для этого довольно медленный...

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

Имеет ли смысл хранить токен как двоичное число, чтобы индекс был намного быстрее сравнения строк?

Проблема также в том, возможно ли хранить такие большие двоичные числа в sqlite?

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

Я не мог найти ничего, что я понимаю...:/ Спасибо!

РЕДАКТИРОВАТЬ: LOLOL... Я не уверен, почему я не понял этого раньше... Я также мог бы преобразовать гекс в обычное целое число, что позволило бы сохранить большую длину ключа... Но в любом случае... Вопрос все еще, если я можно сохранить большие значения, такие как "213119049475094085503159" в Int?

2 ответа

Решение

Что SQLite может хранить как NUMBER определяется здесь

Значение представляет собой целое число со знаком, сохраняемое в 1, 2, 3, 4, 6 или 8 байтах в зависимости от величины значения.

что означает значение, эквивалентное long, Шестнадцатеричная длина

    0102030405060708

чего недостаточно для

2D2134F2487B0ACE08B7

Таким образом, ответ: нет, вы не можете сохранить это как число.

Если вы еще этого не сделали, попробуйте проиндексировать этот столбец, поскольку это ускорит выполнение запроса. Смотрите https://www.sqlite.org/queryplanner.html для довольно хорошего объяснения.

Целые числа SQLite не могут иметь более 64 бит.

Если token индексируется, поиск будет быстрым.

Чтобы сэкономить место, вы можете хранить значения в виде BLOB-объектов:

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

(Индексы SQLite поддерживают все типы данных.)

Другие вопросы по тегам