Действительно ли индексы требуются в хранилище данных? - PullRequest
4 голосов
/ 19 января 2011

Я немного смущен некоторыми документами GAE.Хотя я собираюсь добавить индексы для оптимизации производительности моего приложения, я хотел бы получить некоторые разъяснения относительно того, предлагаются ли они только для этой цели или если они действительно необходимы.

Запросы не могут найти свойствозначения, которые не проиндексированы.Это включает в себя свойства, помеченные как неиндексированные, а также свойства со значениями типа длинного текстового значения (Текст) или типа длинного двоичного значения (Blob).

Запрос с фильтром или порядком сортировки насвойство никогда не будет соответствовать объекту, значение которого для свойства является Text или Blob, или которое было записано с этим свойством, помеченным как не проиндексированное.Свойства с такими значениями ведут себя так, как будто это свойство не установлено в отношении фильтров запросов и порядков сортировки.

из http://code.google.com/appengine/docs/java/datastore/queries.html#Introduction_to_Indexes

Первый абзац заставляет меня поверить, что вы простоне может сортировать или фильтровать неиндексированные свойства.Однако второй абзац заставляет меня думать, что это ограничение ограничено только свойствами Text или Blob или свойствами, специально аннотированными как неиндексированные.

Мне интересно это различие, потому что у меня есть некоторые числовые и строковые поля, которые я в настоящее время сортирую / фильтрую в производственной среде, которые не проиндексированы.Эти запросы выполняются в фоновом режиме, который в основном не заботится о производительности (в этом случае лучше оптимизировать размер / стоимость).Мне как-то просто повезло, что они возвращают правильные данные?

Ответы [ 4 ]

6 голосов
/ 19 января 2011

В хранилище данных GAE автоматически создаются индексы отдельных свойств для всех свойств, которые не могут быть неиндексированы (явно помечены или для этих типов).

Язык в этом документе, я полагаю, немного запутан.

Вам нужно явно определять индексы, только если вы хотите индексировать по более чем одному свойству (скажем, для сортировки по двум разным свойствам.)

4 голосов
/ 26 июля 2013

В GAE, к сожалению, если свойство помечено как неиндексированное

  num = db.IntegerProperty(required=True, indexed=False)

Тогда невозможно включить его в пользовательский индекс ... Это контрпродуктивно (большинство встроенных индексов никогда не используются моим кодом, но занимают много места). Но именно так в настоящее время работает GAE.

Индексы хранилища данных - неиндексированные свойства :

Примечание. Если свойство отображается в индексе, состоящем из нескольких свойств, то установка его в неиндексированное значение не позволит его проиндексировать в составном индексе.

1 голос
/ 26 июля 2013

Никогда не добавляйте свойство в модель без ИСПОЛЬЗОВАНИЯ, вводящего indexed = True или indexed = False.Индексы занимают значительные ресурсы: пространство, затраты на запись и задержка увеличивается при выполнении put ().Мы никогда, никогда не добавляем свойство без явного указания его индексированного значения, даже если index = False.Сохраняет дорогостоящие упущения и вынуждает всегда немного думать о том, индексировать или нет.(В какой-то момент вы обнаружите, что проклинаете тот факт, что вы забыли переопределить значение по умолчанию = True.) Инженеры GAE отлично справились бы с задачей, не допустив, чтобы по умолчанию True Imho.Я бы просто не предоставил дефолт на их месте.НТН.-stevep

0 голосов
/ 19 января 2011

Вы должны использовать индекс, если хотите использовать две или более функции фильтра в одном запросе.
например:
Foobar.filter ('foo =', foo) .filter ('bar =', bar)

если вы просто делаете запрос с одним фильтром, нет необходимости использовать индекс, который генерируется автоматически.

для Blob и Text вы не можете сгенерировать для них индекс, даже если вы указали его в index.yaml, а в них вы не можете использовать фильтр. например,
Класс Foobar (db.Model):
content = db.TextProperty ()
Foobar.filter ('content =', content)
приведенные выше коды вызовут ошибку, поскольку TextProperty не может быть назначен индекс и не может быть сопоставлено.

...