#python #sqlite #indexing
#python #sqlite #индексирование
Вопрос:
У меня есть простая таблица для хранения ключей / значений:
CREATE TABLE IF NOT EXISTS Cache (
id INTEGER NOT NULL,
key TEXT NOT NULL,
value BLOB DEFAULT NULL,
UNIQUE (key),
PRIMARY KEY (id) )
Теперь, имея 350 тысяч записей, я хочу получить около 60 тысяч записей, key
что иногда занимает около 10 минут!
for chunk in chunks:
param_subs = ','.join(itertools.repeat('?', len(chunk)))
cursor.execute(f"SELECT * FROM `Cache` WHERE `key` in ({param_subs})", chunk)
data.extend(cursor.fetchall())
Я не знаю, что еще я могу с этим поделать?
PS: Ключевой столбец на самом деле является хэшем sha1 некоторых строк, если это помогает найти способ ускорить процесс.
Список индексов:
[(0, 'sqlite_autoindex_Cache_1', 1, 'u', 0)]
и мой запрос, и его план:
'EXPLAIN QUERY PLAN SELECT * FROM `CACHE` WHERE `KEY` IN ("FOO", "BAR")'
[(0, 0, 0, 'SEARCH TABLE CACHE USING INDEX sqlite_autoindex_Cache_1 (key=?)'),
(0, 0, 0, 'EXECUTE LIST SUBQUERY 1')]
Комментарии:
1. Попробуйте индексировать этот столбец
2. @GProst Я уже пометил его как уникальный, и я подумал, что он создает индекс под капотом, не так ли?
3. Не обязательно, существует уникальное ограничение и уникальный индекс, проверьте, запросив
PRAGMA index_list('table_name');
4. @GProst он показывает «[(0, ‘sqlite_autoindex_Cache_1’, 1, ‘u’, 0)]» и когда я смотрю на план запроса, он использует этот индекс.
5. Итак, вы добавляете 60 тыс. хэшей в запрос?