Python: SQLite-запрос с LIKE очень медленный - PullRequest
0 голосов
/ 20 февраля 2020

У меня довольно большая база данных, размером 5 ГБ, размещенная на сетевом диске. Одна таблица выглядит так:

CREATE TABLE Labels (
   LabelID  integer PRIMARY KEY,
   LabelName text COLLATE NOCASE
)

CREATE INDEX "labelname" ON "Labels" (
    "LabelName" COLLATE NOCASE
)

Ярлыки таблицы содержат 200 тыс. Строк. Оператор SQL, подобный этому, выполняется за 0,5 секунды:

SELECT * FROM Labels WHERE LabelName IN ("Foo", "Bar")

При использовании выражения "LIKE" он принимает "возраст":

SELECT * FROM Labels WHERE LabelName IN ("Foo", "Bar") or LabelName LIKE "Foo%Bar"

Это влияет на 20000 строк и занимает 5 минут до завершения.

Почему это так? Я подозреваю, что я делаю что-то не так, потому что простая файловая операция выполняется намного быстрее. Я только что попробовал и экспортировал все метки из таблицы в текстовый файл (~ 40MByte). Выполнение:

import fnmatch
labels = list(open(r'my_labelnames.txt'))
hits = fnmatch.filter(labels, 'Foo*Bar')
print len(hits)

Получает также ~ 20k хитов и занимает всего 11 секунд. Таким образом, скорость сети не имеет значения.

Почему это "НРАВИТСЯ" заявление столь медленное?

Спасибо!

РЕДАКТИРОВАТЬ Спасибо за Типп с объяснением. Вот запрос (комбинация IN () и LIKE):

SELECT * FROM Labels WHERE LabelName IN ("Foo", "Bar") or LabelName
LIKE "func_%"  
--> Takes 211.245999813sec  
--> Num rows returned: 18210

With Explain:

[(0, 0, 0, u'EXECUTE LIST SUBQUERY 1'), (0, 0, 0, u'SEARCH TABLE Labels USING COVERING INDEX labelname (LabelName=?)'), (0, 0, 0, u'SEARCH TABLE Labels USING COVERING INDEX labelname (LabelName>? AND LabelName<?)')]
...