Как правильно перебрать огромный QuerySet в Django? - PullRequest
1 голос
/ 08 октября 2010

Мне нужно получить 5 объектов, которые соответствуют определенным сложным критериям, и я не могу / не хочу передавать эти критерии в предложение WHERE (фильтр в django), поэтому мне нужно перебрать результаты, протестировавкаждая запись для критериев, пока я не получу свои 5 объектов, после этого я хочу отбросить установленный запрос и больше никогда его не видеть.

В большинстве случаев нужные мне записи будут в начале набора запросов, в худшем случае - в конце.Таблица огромна, и мне нужно всего 5 записей.Итак, мой вопрос: как я могу выполнить итерацию по набору запросов без django для кэширования результатов?Это должно быть сделано таким образом, чтобы ни движок sql / django нигде не сохранял / не кэшировал результаты.

Ответы [ 2 ]

1 голос
/ 08 октября 2010

Почему вы беспокоитесь о кешировании?Пусть Django или MySQL делают то, что они делают.

Если вы склонны к этому.Вы можете отключить кеширование для Django.Это довольно просто сделать в settings.py для вашего проекта.

Для Mysql вам нужно запустить несколько запросов, чтобы отключить кеш запросов -

Попробуйте использовать SQL_NO_CACHE вариант в вашем запросе.Точно так же

SELECT SQL_NO_CACHE * FROM TABLE

Это остановит MySQL кеширование результатов, однако следует помнить, что другие ОС и дисковые кеши могут также влиять на производительность.С ними труднее обойтись.

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

ИЛИ

Вы также можете сделать RESET QUERY CACHE

ИЛИ

FLUSH QUERY CACHE

Хотя следует отметить, что я бы посоветовал разрешить Mysql обрабатывать предложение WHERE, поскольку в нем есть слой оптимизации запросов, который будет очень эффективен, если у вас естьправильные поля проиндексированы.Получение всех результатов и выполнение действия WHERE может замедлить работу в зависимости от размера набора запросов.Просто кое что для раздумий.Я думаю, правильный тест должен показать вам путь.

0 голосов
/ 08 октября 2010

Django не имеет глобального кэша (см. Тикет № 14).Это означает, что до тех пор, пока вы ничего не держите, данные исчезнут и больше не будут кэшироваться.В этот момент сборщик мусора удалит выделение памяти при следующей очистке.Поэтому такой код, как:

my_objects = [obj for obj in MyModel.objects.all() if my_complex_condition(obj)]

Единственный django для кэширования, который здесь используется, это конкретный пример выше, и после этой строки любая ссылка на кэш будет удалена.Обратите внимание, что если бы у Django не было кеша вообще, память все равно была бы заполнена таким же образом, и сборщик мусора мог бы собирать строки индивидуально любым способом.

...