NDB-индекс свойства datetime и родительских функций - PullRequest
2 голосов
/ 27 апреля 2019

Я не совсем уверен в своем понимании индексов.
(уровень комфорта: 87%)

Влияет ли родительское влияние на расположение индекса на планшетах BigTable. Или это чисто определяется по виду?

Мой пример:

Как правило, было бы плохой идеей индексировать свойство datetime, если вид сущности подвержен частым операциям записи.

Но если родитель является довольно равномерно распределенным случайным ключом, и маловероятно, что будет 2 сущности типа Proposed (), которые имеют одного и того же родителя, у меня все еще будет проблема с монотонным возрастающим индексом создание значений горячих точек ?

(я использую App Engine Standard, Python 2.7.)

« '' # ... У меня есть такой вид сущности:

class Proposed(ndb.Model):
    foo = ndb.StringProperty(indexed=True, default=None)
    bar = ndb.IntegerProperty(indexed=True, default=0)
    date = ndb.DateTimeProperty(indexed=True, auto_now_add=True)

#… create a randomly distributed key

random_id = int(random.uniform(0, 9999999999999999))
parent_key = ndb.Key(‘Papa', random_id)

#…I parent the entity to the random key

p = Proposed(parent=parent_key)
p.foo = ‘a ball of string’
p.bar = 42
p.put()

#…and I query using inequality filter

q = Proposed.query(ndb.AND(Proposed.bar == 42,
                           Proposed.date >= start_date,
                           Proposed.date < end_date))

« ''


Документы, которые, казалось, указывали на это (предковое) решение:

https://cloud.google.com/appengine/articles/indexselection

Описывает иерархию индексов.

https://cloud.google.com/appengine/docs/standard/python/datastore/indexes#index-definition-structure

"Строки таблицы индекса сначала сортируются по предку, а затем по значениям свойств в порядке, указанном в определении индекса."

https://cloud.google.com/datastore/docs/best-practices#high_readwrite_rates_to_a_narrow_key_range

"Избегайте высоких скоростей чтения или записи для ключей Cloud Datastore, которые лексикографически близки. Облачное хранилище данных основано на базе данных Google NoSQL Bigtable и зависит от характеристик производительности Bigtable. Большие таблицы масштабируются путем разбиения рядов на отдельные планшеты, и эти ряды лексикографически упорядочены по ключу "


Альтернативные решения:

1) Создайте строковое свойство datetime с добавленным случайным хешем.
2) Создайте строку даты и времени с обратным порядком: миллисекунда: секунда: минута: час день: месяц: год

Я вижу, как эти решения могут работать, запрашивая фильтр равенства, однако я буду использовать фильтр неравенств по датам, и я не вижу, как запросить диапазон дат с помощью этого метода.

Смиренное Спасибо!

1 Ответ

0 голосов
/ 30 апреля 2019

Вы захотите перейти с вариантом (1), где ваши префиксы хорошо известны. Если ваши префиксы плохо известны, у вас возникнут трудности с запросом ваших сущностей по метке времени. Если вы не хотите выполнять запрос по отметке времени, вы можете отключить индексирование для свойств отметки времени. руководство по передовому опыту для более подробной информации.

Предок сущности не помогает с монотонно увеличивающимся значением индекса, поскольку Cloud Datastore по-прежнему позволяет выполнять запросы по видам, например, select * from Proposed order by date. Этот запрос не использует предка, и, следовательно, вы можете определить, что используемый индекс не использует предка.

...