2009-12-01 8 views
6

Estoy a punto de usar la clase Zend_Paginator en mi proyecto. Encontré ejemplos de la clase en internet. Uno de ellos esZend_Paginator; está optimizado?

$sql = 'SELECT * FROM table_name ';  
$result = $db->fetchAll($sql);  
$page=$this->_getParam('page',1);  
$paginator = Zend_Paginator::factory($result); 
$paginator->setItemCountPerPage(10)); 
$paginator->setCurrentPageNumber($page); 
$this->view->paginator=$paginator; 

en la primera línea, en realidad selecciona todas las filas de table_name. ¿Qué pasa si tengo una tabla con 50000 filas? Eso sería muy ineficiente.

¿Hay alguna otra forma de utilizar Zend Paginator?

Respuesta

12

Sobre este problema, que podría estar interesado por esta sección del manual: 39.2.2. The DbSelect and DbTableSelect adapter, que establece (citando, el énfasis es mío):

... los adaptadores de base de datos requieren una explicación más detallada .
Contrariamente a popular creen, estos adaptadores no recuperan todos los registros de la base de datos en para contarlos.

En cambio, los adaptadores manipulan la consulta original para generar la consulta correspondiente COUNT.
Paginator ejecuta esa consulta COUNT para obtener el número de filas .

Esto requiere un extra de ida y vuelta a la base de datos, pero este es muchas veces más rápido que ir a buscar un resultado conjunto completo y el uso de count().
Especialmente con grandes colecciones de datos .

(No hay más que leer en esa página - y no es un ejemplo que debe darle más información)


La idea es que que no se ha podido recuperar todos los datos por sí mismo ya, pero le dirá al Zend_Paginator qué adaptador debe usar para acceder a sus datos.

Este adaptador será específico para "los datos que capta a través de una consulta SQL", y sabrá cómo paginarla directamente en el lado de la base de datos - lo que significa ir a buscar sólo lo que se requiere, y no todos los datos como tu primeramente lo hiciste

7

Recomiendo pasar un objeto Zend_Db_Select como Zend_Paginator::factory($select); en lugar de pasar un conjunto de filas de resultados. De lo contrario, está seleccionando el conjunto de resultados completo y luego haciendo la paginación. En su solución actual, si tenía un millón de filas, las seleccionaría todas antes de obtener la cantidad de filas definidas por la página actual.

+0

+1 esto es lo que usamos para grandes conjuntos de datos también. – Aaron

Cuestiones relacionadas