trucos tips para optimizar lentas consultas php mysql pdo

tips - Problema de consulta almacenada en PHP PDO



tips para php (3)

Podrías tratar de dividirlo en pedazos que no son lo suficientemente grandes como para causar problemas:

<?php $id = 0; $rQuery = $Database->query(''SELECT id FROM mytable ORDER BY id ASC LIMIT 100''); do { stuff($rQuery); $id += 100; } while ( $rQuery = $Database->query( ''SELECT id FROM mytable ORDER BY id ASC LIMIT 100 OFFSET ''.$id ) ); ?>

... entiendes la idea, de todos modos.

Estoy teniendo serios problemas con las funciones del Objeto de Datos PHP. Estoy intentando recorrer un conjunto de resultados considerable (~ 60k filas, ~ 1gig) usando una consulta almacenada para evitar recuperar todo el conjunto.

No importa lo que haga, la secuencia de comandos simplemente cuelga en PDO :: query () - parece que la consulta se está ejecutando sin búfer (¿por qué otra cosa cambiaría el tamaño del conjunto de resultados ''solucionando'' el problema?). Aquí está mi código para reproducir el problema:

<?php $Database = new PDO( ''mysql:host=localhost;port=3306;dbname=mydatabase'', ''root'', '''', array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true ) ); $rQuery = $Database->query(''SELECT id FROM mytable''); // This is never reached because the result set is too large echo ''Made it through.''; foreach($rQuery as $aRow) { print_r($aRow); } ?>

Si limito la consulta con un número razonable, funciona bien:

$rQuery = $Database->query(''SELECT id FROM mytable LIMIT 10'');

He intentado jugar con PDO :: MYSQL_ATTR_MAX_BUFFER_SIZE y usar PDO :: prepare () y PDO :: execute () también (aunque no hay parámetros en la consulta anterior), ambos en vano. Cualquier ayuda sería apreciada.


Si entiendo este derecho, las consultas almacenadas en búfalo implican decirle a PHP que desea esperar el conjunto completo de resultados antes de comenzar el procesamiento. Antes de PDO, este era el valor predeterminado y tenía que llamar a mysql_unbuffered_query si quería tratar los resultados de inmediato.

Por qué esto no se explica en la página del controlador de MySQL de PDO, no lo sé.


O tal vez podrías probar las funciones de mysql en su lugar:

while ($row = mysql_fetch_row($query)) { ... }

Lo cual definitivamente será más rápido, ya que esa declaración foreach produce una impresión al usar fetchAll() lugar de fetch() cada fila