У меня есть запрос, который включает 3 таблицы.Допустим, A, B и C. A является мастером B, а B является мастером C. Давайте также предположим, что для каждого A есть не менее 30 Bs, а для каждого B - не менее 100 Cs.
Требование включает представление каждого A, затем всех B для этого A в этом A, а затем всех C в каждом B. Так что, если есть 200 A, это принесло бы мне 600 000 строк.
Естьтакже много параллелизма на сервере, поэтому, если запросы занимают много времени, пользователи могут обновиться и могут возникнуть утечки памяти.
Поэтому мы внедряем и экспериментируем с различными решениями:
Выполнить большой запрос , который объединяет 3 таблицы и затем упорядочить результат в php.
Мы создали модуль, который может открывать несколько httpсокеты и выполнить несколько страниц PHP в параллельно .Таким образом, мы можем поместить каждую таблицу в отдельных страниц и собрать то, что нужно, уже готовое для представления через эти сокеты.Модуль управляет стеком результатов, доступными сокетами и рендерингом, поэтому данные будут отображаться только тогда, когда это необходимо, а не когда они поступят.
Плюсы и минусы:
1.
Pro: База данных делает все за меня.Pro: может быть больше одновременных запросов, если наборы данных малы.
Con: много обработки в php, если слишком много записей, многие пользователи могут ждать их данные вечно, так как егооказываться линейно.Против: Если пользователи перезагружаются, может быть много гигантских длительных запросов и выполняющихся процессов php, которые потребляют память и процессор.
2.Pro: В тестах, которые мы сделали, параллельная обработка php намного быстрее, примерно на 500% быстрее, чем использование одного процесса в целом.Pro: использование памяти и утечки памяти уменьшены, поскольку процессы длятся очень мало времени.
Con: Процессор иногда блокируется из-за количества одновременных запросов, выполняемых сокетами, и его решение решается путем ограничения количества сокетов, которые могутбыть открыт на 5 страниц. Таким образом, для 3 таблиц может быть открыто не более 125 сокетов одновременно (A открывает 5, все его B открываются 5 (25), а все C открываются 5 (125)).Против: Не используется база данных в полном объеме.
Мы ориентируемся на распараллеливание, которое можно сделать с помощью второго решения.Мы думаем, что с небольшой балансировкой нагрузки мы сможем увеличить скорость еще больше, но мы будем использовать базу данных не полностью:
Вопросы:
Кто-нибудь сделал что-то подобное?Что вы сделали, когда вам нужно было создавать большие отчеты с использованием php?Вы буферизовали данные в файлах?Должны ли мы создавать отчеты на другом языке и передавать их в php?
Если бы sql мог создавать разные наборы данных в гигантском запросе и организовывать данные по некоторым параметрам, это было бы так здорово!