2012-06-20 4 views
7

Кто-то поднял функцию multi_query MySQLi в ответ, утверждая, что было бы лучше, чем цикл через 3 отдельных запроса. Я попытался ответить на какой-то ответ Google, но на самом деле не получил ничего, что действительно удовлетворяло мое любопытство, поэтому я надеюсь, что вы, ребята, можете лучше понять причины его использования, а не сохранять несколько строк кода.Является ли mysqli :: multi_query более эффективным, чем несколько отдельных запросов?

Итак, вот что я думаю:

  1. Что multi_query делает под капотом?
  2. Удаляет ли multi_query на сервере x количество раз и агрегирует результаты?
  3. Есть ли случай, когда одиночные запросы могут быть более эффективными, чем несколько запросов?

Я знаю, что попадание базы данных 3 раза за миллион элементов и разбиение их на один огромный объект не подходит для использования в памяти, но я знаю, что для его существования должна быть причина, и я также убедитесь, что есть моменты, когда этого следует избегать. Я надеюсь лучше понять это, чтобы я мог поместить это в свою сумку трюков, когда возникнет такая необходимость.

Спасибо за ваше время!

+0

Сценарий больше похож на вариант MYSQLI_ASYNC в mysqli_query(). –

ответ

11
  • 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() будет лучше, так как возвращаемые значения будут просто успешными/неудачными, а потребление памяти будет светлым.

    Вам придется взвесить все факторы, как то, что вы делаете, сколько времени вы ожидаете от него, латентность сети между сервером (клиентом) и клиентом, доступными ресурсами (в основном, память) на сервере и клиент и т. д. и т. д. ... и принимать его в каждом отдельном случае.

Я нашел это record of some performance testing сделал некоторое время назад, когда вывод о том, что есть общий выигрыш в эффективности можно найти с помощью multi_query(). Тем не менее, тестовый случай просто запускал 4 запроса, каждый из которых SELECT в одном результате, а определение «более эффективно» просто «быстрее». Нет тестирования для большего количества запросов или больших наборов результатов, и, хотя скорость важна, это не все и все - я могу сделать что-нибудь невероятно быстро, если я дам ему неограниченное количество памяти, но попытка сделать что-то одновременно потерпит неудачу.Это также не тест реального мира, так как конечный результат может быть достигнут с помощью одного запроса JOIN. Тем не менее, это делает некоторые интересные чтения.

Лично я считаю, что это несколько академический, потому что если вы - это, работающий с большим набором операторов одновременно, 90% времени они будут меняться только в передаваемых данных и структура запроса останется неизменной - что является очевидным кандидатом на подготовленные заявления.

+0

+1 для ясности и усилий. – brezanac

+0

@DaveRandom Спасибо за отличный ответ. Таким образом, multi_query не обязательно более эффективен на сервере, но вместо этого сохраняет только некоторые поездки на сервер db. Честно говоря, я не понимаю, как это когда-нибудь будет полезно, если вы не будете делать обновления или создавать или что-то, что возвращает логическое значение, как вы упомянули. Спасибо, что накормил мое любопытство. – EmmanuelG

1

Ответ выше неправильный.

Что такое multi_query под капотом?

Он просто отправляет все запросы на сервер за один раз, , при получении результата только для первого. Таким образом, multi_query - это своего рода оболочка для выполнения асинхронного запроса .

Несколько экземпляров multi_query попадают на сервер x раз и агрегируют результаты?

multi_query попадает на сервер только один раз. Все остальные хиты вы должны сделать вручную, вызвав next_result, чтобы получить все остальные запросы.

Есть ли случай, когда одиночные запросы могут быть более эффективными, чем несколько запросов?

Этот вопрос предполагает, что существует случай, когда multi_query работает быстрее. Это сомнительное утверждение. Для обычного запроса сетевая латентность является незначительной частью всего времени выполнения. Если вы действительно заинтересованы в скорости на , то такой маркер, посмотрите HandlerSocket - он будет быстро разгоняться. Однако для регулярной разработки такая разница между одним и несколькими запросами была бы вашей наименее заботой. Если вы занимаетесь вопросами реальной жизни, а не воображаемыми.

Смежные вопросы