PHP: параллельные запросы SQL против одного большого SQL - PullRequest
0 голосов
/ 23 июня 2011

У меня есть запрос, который включает 3 таблицы.Допустим, A, B и C. A является мастером B, а B является мастером C. Давайте также предположим, что для каждого A есть не менее 30 Bs, а для каждого B - не менее 100 Cs.

Требование включает представление каждого A, затем всех B для этого A в этом A, а затем всех C в каждом B. Так что, если есть 200 A, это принесло бы мне 600 000 строк.

Естьтакже много параллелизма на сервере, поэтому, если запросы занимают много времени, пользователи могут обновиться и могут возникнуть утечки памяти.

Поэтому мы внедряем и экспериментируем с различными решениями:

  1. Выполнить большой запрос , который объединяет 3 таблицы и затем упорядочить результат в php.

  2. Мы создали модуль, который может открывать несколько 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 мог создавать разные наборы данных в гигантском запросе и организовывать данные по некоторым параметрам, это было бы так здорово!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...