Вопрос

Предположим, что у меня есть модель Foo в GAE и этот запрос:

query = Foo.all (). order ('- ключ ')

Я хочу получить n-ую запись. Какой самый эффективный способ добиться этого?

Решение сломается, если свойство упорядочения не является уникальным, например, как показано ниже:

query = Foo.all (). order ('- цвет ')

edit: n > 1000

edit 2: Я хочу разработать дружественный механизм подкачки страниц, который отображает доступные страницы (например, Страница 1, Страница 2, ... Страница 185) и требует "? page = x " в строке запроса вместо «? bookmark = XXX». Когда page = x, запрос должен извлекать записи, начиная с первой записи на этой странице.

Это было полезно?

Решение

Нет эффективного способа сделать это - ни в одной СУБД. В любом случае вы должны по крайней мере последовательно читать записи индекса, пока не найдете n-ную, а затем найти соответствующую запись данных. Это более или менее то, что fetch (count, offset) делает в GAE с дополнительным ограничением в 1000 записей.

Лучшим подходом к этому является сохранение «закладки», состоящей из значения поля, в котором вы упорядочиваете последнюю полученную вами сущность, и ее ключа. Затем, если вы хотите продолжить с того места, на котором остановились, вы можете добавить значение поля в качестве нижней границы запроса неравенства и пропускать записи до тех пор, пока не совпадете или не превысите последний, который вы видели.

Если вы хотите предоставить «дружественные» смещения страниц пользователям, вы можете использовать memcache для хранения связи между начальным смещением и кортежем закладки (order_property, key). Когда вы создаете страницу, вставьте или обновите закладку для сущности, следующей за последней. При извлечении страницы используйте закладку, если она существует, или сгенерируйте ее сложным способом, выполняя запросы со смещениями - возможно, несколько запросов, если смещение достаточно велико.

Другие советы

Документацию для класса Query можно найти по адресу: http://code.google.com/appengine/docs/ питон / хранилищу / queryclass.html # Запрос

Класс запроса предоставляет выборку, которая принимает предел и смещение в вашем случае 1 и n

Время выполнения выборки растет линейно со смещением + пределом

поэтому единственный способ оптимизации в вашем случае - убедиться, что нужные записи Доступ чаще всего находится ближе к началу массива.

Вы можете использовать query.filter ('key =', n) query.get ()

который вернет первое совпадение с ключом n

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top