2012-06-20 30 views
7

Alguien mencionó la función MySQLi multi_query en una respuesta que afirma que sería mejor que recorrer tres consultas separadas. Traté de buscar algún tipo de respuesta a esto, pero realmente no obtuve nada que realmente satisficiera mi curiosidad, así que espero que ustedes puedan tener una mejor idea de las razones para usarlo en lugar de guardar algunas líneas de código.¿Es mysqli :: multi_query más eficiente que varias consultas únicas?

Así que aquí es lo que me pregunto:

  1. Lo que está haciendo una consulta múltiple bajo el capó?
  2. ¿multi_query simplemente golpea el servidor x número de veces y agrega los resultados?
  3. ¿Hay algún caso en el que las consultas individuales sean más eficientes que las consultas múltiples?

Sé que golpear la base de datos 3 veces por un millón de elementos cada uno y romperlo en un objeto enorme no es bueno para el uso de la memoria, pero sé que debe haber una razón para su existencia y yo soy También estoy seguro de que hay momentos en los que debe evitarse. Espero comprenderlo mejor para poder poner eso en mi bolsa de trucos cuando surja la necesidad.

¡Gracias por su tiempo!

+0

El escenario suena más parecido a usar la opción MYSQLI_ASYNC en mysqli_query(). –

Respuesta

11
  • What is multi_query doing under the hood? - Sólo el envío de todas las consultas al servidor a la vez en lugar de a uno por vez, y recuperar todos los resultados en una sola vez. No hay nada más complicado que eso.

  • Does multi_query simply hit the server x number of times and aggregates the results? - "acierta" el servidor dos veces: una para enviar las consultas y otra para recuperar los resultados.

  • Is there a case where single queries may be more efficient than multiple queries? - depende de cómo defina "eficiente". multi_query() es liviano en la red pero con una gran cantidad de memoria, ejecuta query() en un ciclo viceversa.

    Para muchas declaraciones SELECT que devuelven grandes conjuntos de resultados, la pérdida en el consumo de memoria es muy superior a la ganancia en términos de la red y la mayoría de las veces sería mejor emitir las consultas y procesar los conjuntos de resultados uno a la vez, aunque esto depende exactamente de lo que esté haciendo con los datos. Pero si necesita ejecutar muchas declaraciones UPDATE, es probable que multi_query() sea mejor ya que los valores devueltos son satisfactorios/incorrectos y el consumo de memoria será leve.

    Tendría que sopesar todos los factores como lo que está haciendo, cuánto tiempo espera que tome, la latencia de red entre el servidor (base de datos) y el cliente, los recursos disponibles (principalmente memoria) en el servidor y el cliente, etc., etc., y tómelo caso por caso.

yo encontramos este record of some performance testing hecho hace un tiempo, donde la conclusión es que hay un aumento de la eficiencia general que se encuentran el uso de multi_query(). Sin embargo, el caso de prueba simplemente estaba ejecutando 4 consultas, cada una SELECT con un solo resultado, y la definición de "más eficiente" es simplemente "más rápida". No hay pruebas para un mayor número de consultas o conjuntos de resultados más grandes y, aunque la velocidad es importante, no es el todo y el final: puedo hacer que todo funcione increíblemente rápido si le doy una cantidad ilimitada de memoria, pero un intento de hacer algo al mismo tiempo fracasará miserablemente.Tampoco es una prueba del mundo real, ya que el resultado final se puede lograr con una sola consulta ed JOIN. Sin embargo, es una lectura interesante.

Personalmente creo que esto es algo académico porque si es ejecutando un gran conjunto de declaraciones a la vez, el 90% del tiempo variarán solo en los datos que se pasan y la estructura de la consulta seguirá siendo la misma - que es un candidato obvio para las declaraciones preparadas.

+0

+1 para mayor claridad y esfuerzo. – brezanac

+0

@DaveRandom Gracias por su excelente respuesta. Entonces, multi_query no es necesariamente más eficiente en el servidor, sino que solo guarda algunos viajes al servidor de db. Honestamente, no veo cómo esto realmente podría ser útil a menos que estés haciendo actualizaciones o creaciones o algo que devuelva un booleano como el que mencionaste. Gracias por alimentar mi curiosidad. – EmmanuelG

1

La respuesta anterior es incorrecta.

¿Qué está haciendo multi_query under the hood?

Simplemente envía todas las consultas al servidor de inmediato, mientras recupera el resultado para la primera solamente. Entonces, en efecto, multi_query es una especie de contenedor para la ejecución de consulta asincrónica .

¿Multi_query simplemente golpea el servidor x número de veces y agrega los resultados?

multi_query golpea el servidor una sola vez. Todas las otras visitas debe hacer manualmente, llamando a next_result, para obtener todos los resultados de otras consultas.

¿Hay un caso donde las consultas individuales pueden ser más eficientes que múltiples consultas?

esta pregunta asume que hay un caso cuando multi_query es más rápido. Que es una declaración cuestionable. Para la consulta habitual, la latencia de la red es una parte insignificante de todo el tiempo de ejecución. Si está realmente preocupado por la velocidad por tal margen, eche un vistazo al HandlerSocket - será extremadamente rápido. Sin embargo, para un desarrollo regular, tal diferencia entre consultas simples y múltiples sería su menor preocupación. Si te importan los asuntos de la vida real, no los imaginarios.

Cuestiones relacionadas