Низкая производительность индекса текстового столбца в sqlite3

#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 тыс. хэшей в запрос?