Шестнадцатеричная строка против большого индекса 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 поддерживают все типы данных.)