У меня довольно большая база данных, размером 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<?)')]