Как appengine эффективно реализует запрос к списку? - PullRequest
5 голосов
/ 27 августа 2011

Из блога appengine:

Расширенное планирование запросов. Мы избавляемся от необходимости взрывать индексы и уменьшаем требования к пользовательским индексам для многих запросов. SDK предложит лучшие индексы в нескольких случаях, и в следующей статье будет описано, какие дальнейшие оптимизации возможны.

В качестве теста у меня есть сущность в appengine, у которой есть listProperty

class Entity(db.Model):
  tags = db.StringListProperty()

У меня 500 000 сущностей, половина из них имеет теги = ['1'], а другая половина имеет теги = ['2']

мой запрос

SELECT FROM Entity WHERE tags='1' and tags='2'

Результаты не возвращаются очень быстро. Какой план он использует для достижения этой цели? Как список индексируется для достижения этой цели? В старые времена требовался взрывной индекс.

1 Ответ

2 голосов
/ 27 августа 2011

Алгоритм, использованный для внутреннего использования ('merge-join'), был описан в техническом докладе Google I / O 2009 Создание масштабируемых, сложных приложений на App Engine . Эта функциональность также была доступна с момента запуска GAE; «взрывные индексы» происходят только в том случае, если вы создаете составной индекс из нескольких StringListProperties.

Стоит отметить, что эта функция на самом деле немного более общая, чем вы можете себе представить - любая комбинация нескольких фильтров равенства для любой произвольной комбинации свойств может быть удовлетворена без каких-либо составных индексов, при условии, что все они являются фильтрами равенства нет порядка сортировки. Все они не обязательно должны быть из StringListProperty и даже могут быть разбиты на несколько StringListProperty.

...