Допустим у меня есть база с таблицей emails: mail, password, works, banned и мне нужно взять из этой таблицы почту+пароль, рабочие, не забаненые, только с доменом yandex.ru. Пишу соответствующий запрос к БД в кубике. Получившийся результат, допустим 100 аккаунтов, мне нужно скормить регистратору. Какой подход более грамотный - сделать запрос один раз в начале проекта и сохранить результат в список и брать из списка по одной строчке каждый новый цикл или написать запрос так, чтобы он по очереди выдавал только одну строку в переменную каждый новый цикл и уже регистратор будет брать почту из этой перменной?
Если, мы работаем в 1 поток, внутри шаблона, тогда:
Запрос к базе, к примеру 10 секунд.
Регистрация аккаунта, например 100 секунд.
В случае если мы возьмем 1 запросом 100 строчек - наши накладные затраты по времени = 10 секунд.
Остальное время - полезные действия (например регистрация).
В конце работы - отчитываемся перед базой - ещё 1 запрос.
Вместе накладных расходов 20 секунд времени.
Итого, спустя 100*100+20 = 10 020 секунд мы получим наши аккаунты.
В этом соотношении накладные расходы составили 0,2%.
Спустя это время мы получим 100 аккаунтов.
Рассмотрим аналогичную ситуацию, но, на каждом запросе мы получаем 1 строчку.
Тогда 100*100+20*100 = 12 000 секунд мы получим наши аккаунты.
В этом соотношении - накладные расходы составили 20%.
Спустя это время мы получим 100 аккаунтов.
Если, мы работаем в 100 потоков, тогда:
Может показаться, что вот, если мы будем работать в многопоточном режиме, то ситуация изменится кардинально.
Нужно смоделировать ситуацию примерно так - каждый отдельный поток будет работать какое-то время, и зарегистрирует нам 100 аккаунтов.
Тогда, если мы запускаем 100 потоков одновременно, получим такой расчёт:
В первом случае: 100*100*100 + 20*100 = 1 002 000 секунд.
Во втором случае: 100*100*100 + 20*100*100 = 1 200 000 секунд.
Итого, спустя это время мы получим 10 000 аккаунтов.
Ну, и конечно, возможно я ошибся в расчётах...
P.S. Точно ошибся - результат ещё нужно на 100 поделить - получится, что в 100 потоков просто в 100 раз быстрее работа выполнится, но, пропорции издержек сохранятся.