What is multi_query doing under the hood?
- просто посылка всех запросов на сервер одновременно, а не по одному, и получение всех результатов за один раз. Ничего сложнее. Does multi_query simply hit the server x number of times and aggregates the results?
- он дважды «ударяет» по серверу - один раз для отправки запросов и один раз для получения результатов. Is there a case where single queries may be more efficient than multiple queries?
- зависит от того, как вы определяете «эффективный». multi_query()
светится в сети, но память тяжелая, работает query()
в контуре наоборот. Для многих операторов SELECT
, которые возвращают большие результаты, потери в потреблении памяти, вероятно, значительно перевесят выигрыш в терминах сети, и большую часть времени вам будет лучше выдавать запросы и обрабатывать результат, устанавливаемый на одном время - хотя это зависит от того, что вы делаете с данными. Но если вам нужно запустить много UPDATE
операторов, вполне вероятно, что multi_query()
будет лучше, так как возвращаемые значения будут просто успешными / неудачными, а потребление памяти будет светлым. Вам придется взвесить все факторы, как то, что вы делаете, сколько времени вы ожидаете от этого, латентность сети между сервером (клиентом) и клиентом, доступными ресурсами (в основном памятью) на сервере и клиентом и т. Д. , и т. д. ... и возьмем его в каждом конкретном случае. Я нашел эту запись для некоторых тестов производительности , сделанных некоторое время назад, когда вывод что от использования multi_query()
можно получить общий коэффициент полезного действия. Однако тестовый случай просто выполнял 4 запроса, каждый из которых SELECT
имел единственный результат, а определение «более эффективно» просто «быстрее». Нет тестирования для большего количества запросов или больших наборов результатов, и, хотя скорость важна, это не все и все - я могу сделать что-нибудь невероятно быстро, если я дам ему неограниченное количество памяти, но попытка сделать что-то одновременно потерпит неудачу. Это также не тест реального мира, так как конечный результат может быть достигнут с помощью одного запроса JOIN
ed.
Лично я считаю, что это несколько академический, потому что если вы запускаете большой набор инструкций сразу, 90% времени они будут изменяются только в передаваемых данных и структура запроса останется неизменной - что является очевидным кандидатом для подготовленных операторов.