Ваша проблема здесь, когда вы пишете: «Запустите 2 маленькие функции с быстрым запросом БД в каждой, чтобы получить такие вещи, как баланс».
Помещение последующего вызова MySQL в цикл, как правило, является плохой идеей, и оно приведет к экспоненциальному увеличению времени отклика в зависимости от объема данных, которые вы получаете. Вместо этого вы должны попытаться получить как можно больше данных за одно соединение с базой данных или минимизировать количество обращений к базе данных. Обычно вы можете многого добиться, используя JOIN
, что-то вроде:
SELECT
c.*,
b.*
FROM
customers as c
LEFT OUTER JOIN
balance as b
ON b.customerId = c.id
/* You can also add other join logic in here to control the data coming back */
WHERE
c.a = ?
AND c.i = ?;
Каждый раз, когда вы запускаете запрос через MySQLi, вы устанавливаете новое соединение с базой данных (которое включает в себя рукопожатие серверов), передаете запрос, ожидаете, пока MySQL обработает запрос, ожидаете, пока сервер MySQL вернет данные, затем закрыть соединение, прежде чем двигаться дальше Если вы сделаете это дважды для каждой записи в вашем результате с 2500 записями, вы столкнетесь с большим количеством накладных расходов - установление и закрытие 5001 соединения из одного скрипта! Присоединение ваших таблиц к первоначальному запросу устраняет все эти дополнительные издержки и возвращает их к одному вызову базы данных. Вы входите, вы получаете все данные, которые вам нужны, и вы возвращаетесь - и это единственное место, где реляционные базы данных, такие как MySQL, действительно сияют.
Подробнее о присоединении таблиц см. Здесь: https://dev.mysql.com/doc/refman/8.0/en/join.html
Примечание: я переключил объявления прямой строки для параметров. Очень плохая идея (TM) - помещать параметры URL непосредственно в MySQL, поскольку это может привести к так называемому внедрению MySQL, когда кто-то может украсть ваши данные и нанести ущерб вашим структурам данных.