Social Profiles

My Projects

Не забывайте про индексы

Часто на этом залипают новички, т.е. создается база данных, затем туда скрипт начинает писать данные, все медленнее, медлееннее и в конце концов каждый инсерт занимает столько времени, что работать с БД становится невозможно. Происходит это из-за примерно таких вот конструкций (псеводокод a la python).

item_obj = Item.objects(item_id=item_id).first()
if item_obj is None:
    # create new item
    item_obj = Item(title=title, item_id=item_id, ...)
else:
    item_obj.updated_at = datetime.utcnow()

item_obj.save()

Т.е что просиходит? Идет поиск - есть ли такой элемент в базе данных, если нет - создается новый и если есть - обновляется. Пример довольно грубый, но суть передает, олсо в MongoDB есть возможность проводить upsert операции, т.е. апдейт или инсерт если не найден.

Так вот, операция поиска элемента по какому-то параметру может занимать довольно внушительное время при большом кол-ве элементов и с ростом этого кол-ва растет и время поиска, поэтому скорость инсертов элементов замедляется по мере роста базы данных. Что можно сделать? Создать индекс для элемента по которому происходит поиск (или сортировка или что-нибудь еще), это значительно ускорит скорость подобных операций.

Индекс (англ. index) — объект базы данных, создаваемый с целью повышения производительности поиска данных. Таблицы в базе данных могут иметь большое количество строк, которые хранятся в произвольном порядке, и их поиск по заданному критерию путем последовательного просмотра таблицы строка за строкой может занимать много времени. Индекс формируется из значений одного или нескольких столбцов таблицы и указателей на соответствующие строки таблицы и, таким образом, позволяет искать строки, удовлетворяющие критерию поиска. Ускорение работы с использованием индексов достигается в первую очередь за счёт того, что индекс имеет структуру, оптимизированную под поиск — например, сбалансированного дерева.

Подробнее про индексы можно прочитать в википедии

comments powered by Disqus