2010-02-07 21 views
5

He usado mucho MySQL, pero siempre me he preguntado exactamente cómo funciona: cuando obtengo un resultado positivo, ¿dónde se almacenan exactamente los datos? Por ejemplo, escribo de esta manera:¿Cómo funcionan las consultas de bases de datos PHP/MySQL exactamente?

$sql = "SELECT * FROM TABLE"; 
$result = mysql_query($sql); 
while ($row = mysql_fetch_object($result)) { 
    echo $row->column_name; 
} 

Cuando se devuelve un resultado, estoy asumiendo que es la celebración de todos los resultados de los datos o lo hace volver en un fragmento y sólo devuelve en el que se pidió, al igual que $ de fila > column_name?

¿O realmente devuelve cada fila de datos, incluso si solo quería una columna en $ resultado?

Además, si yo pagino usando LIMIT, ¿retiene ESE resultado original (antiguo) incluso si la base de datos se actualiza?

Respuesta

8

Los detalles dependen de la implementación pero en general hablando, los resultados están en el búfer. Ejecutar una consulta en una base de datos devolverá un conjunto de resultados. Si es lo suficientemente pequeño, todos los resultados pueden devolverse con la llamada inicial o algunos pueden ser devueltos y se obtienen más resultados a medida que itera sobre el objeto de resultado.

pienso en la secuencia de esta manera:

  1. Se abre una conexión con la base de datos;
  2. Posiblemente haya una segunda llamada para seleccionar una base de datos o se podría hacer como parte de (1);
  3. Ese paso de autenticación y conexión es (al menos) un viaje de ida y vuelta al servidor (ignorando las conexiones persistentes);
  4. Ejecuta una consulta en el cliente;
  5. Esa consulta se envía al servidor;
  6. El servidor debe determinar cómo ejecutar la consulta;
  7. Si el servidor ha ejecutado previamente la consulta, el plan de ejecución aún puede estar en el caché de consultas. Si no, se debe crear un nuevo plan;
  8. El servidor ejecuta la consulta como dada y devuelve un resultado al cliente;
  9. Ese resultado contendrá un búfer de filas que depende de la implementación. Puede ser de 100 filas o más o menos. Todas las columnas se devuelven para cada fila;
  10. A medida que obtiene más filas, el cliente le pedirá al servidor más filas. Esto puede ocurrir cuando el cliente se agota o puede hacerse de forma preventiva. De nuevo, esto depende de la implementación.

La idea de todo esto es para minimizar ida y vuelta al servidor sin necesidad de enviar de regreso demasiado datos innecesarios, por lo que si se le pregunta por un millón de filas no se va a volver a todos a la vez.

Las cláusulas LIMIT, o cualquier cláusula de hecho, modificarán el conjunto de resultados.

Por último, (7) es importante porque SELECT * FROM table WHERE a = 'foo' y SELECT * FROM table WHERE a = 'bar' son dos consultas diferentes en lo que respecta al optimizador de bases de datos, por lo que se debe determinar un plan de ejecución para cada uno por separado. Pero una consulta parametrizada (SELECT * FROM table WHERE a = :param) con diferentes parámetros es una consulta y solo necesita planificarse una vez (al menos hasta que caiga fuera de la memoria caché de consultas).

+0

Tengo Nunca entendí demasiado sobre cómo funcionan las consultas parametrizadas. ¿Es la forma normal de hacer una consulta parametrizada enviar 'SELECT * FROM table WHERE a =: param' al motor de la base de datos junto con los parámetros? Pensé que ': param' sería reemplazado con un valor en el lado del cliente. – jnylen

+0

La consulta parametrizada (posiblemente transformada de la biblioteca del cliente a lo que la base de datos entiende) junto con el parámetro se envían a la base de datos. – cletus

1

La primera pregunta puede ser respondida por leer sobre resources

Puesto que usted está seleccionando "*", cada columna se devuelve para cada llamada mysql_fetch_object. Solo mira print_r ($ row) para ver.

+1

"Cada fila se devuelve para cada llamada' mysql_fetch_object' ?? " Seguramente te refieres a cada _column_. – jnylen

7

Creo que estás confundiendo los dos tipos de variables con las que estás tratando, y ninguna respuesta realmente aclara eso hasta ahora.

$result es un objeto de resultado MySQL. No "contiene ninguna fila". Cuando dice $result = mysql_query($sql), MySQL ejecuta la consulta y sabe qué filas coincidirán, pero los datos no se han transferido al lado de PHP. $result se puede considerar como un puntero a una consulta que solicitó a MySQL para ejecutar.

Cuando dice $row = mysql_fetch_object($result), es cuando la interfaz MySQL de PHP recupera una fila para usted. Solo esa fila se pone en $row (como un simple objeto PHP antiguo, pero puede usar una función de búsqueda diferente para solicitar una matriz asociativa, o columnas específicas de cada fila.)

Las filas pueden almacenarse en búfer la expectativa de que va a recuperar todas las filas en un ciclo cerrado (que generalmente es el caso), pero en general, las filas se recuperan cuando las solicita con una de las funciones mysql_fetch_*.

Si solo desea una columna de la base de datos, entonces debe SELECT that_column FROM .... Usar una cláusula LIMIT también es una buena idea siempre que sea posible, ya que MySQL generalmente puede realizar optimizaciones significativas si sabe que solo quiere un cierto grupo de filas.

0

En palabras simples, el recurso lo devolvió como una identificación que la biblioteca MySQL asocia con otros datos. Creo que es como la tarjeta de identificación en su billetera, es solo un número y cierta información, pero asociado con mucha más información si se lo da al gobierno, o su compañía de teléfono celular, etc.

Cuestiones relacionadas