TigerZF
🌐Español

F.3. Rendimiento de Zend_Db

Zend_Db es una capa de abstracción de base de datos, y está pensada para proporcionar una API común para las operaciones SQL. Zend_Db_Table es un Table Data Gateway, pensado para abstraer las operaciones comunes de base de datos a nivel de tabla. Debido a su naturaleza abstracta y a la "magia" que realizan internamente para llevar a cabo sus operaciones, en ocasiones pueden introducir sobrecarga en el rendimiento.

F.3.1. ¿Cómo puedo reducir la sobrecarga introducida por Zend_Db_Table al obtener los metadatos de la tabla?

Con el fin de mantener el uso lo más sencillo posible, y también para soportar esquemas en constante cambio durante el desarrollo, Zend_Db_Table realiza cierta magia internamente: en el primer uso, obtiene el esquema de la tabla y lo almacena en miembros del objeto. Esta operación suele ser costosa, independientemente de la base de datos, lo que puede contribuir a cuellos de botella en producción.

Afortunadamente, existen técnicas para mejorar la situación.

F.3.1.1. Usar la caché de metadatos

Zend_Db_Table puede utilizar opcionalmente Zend_Cache para almacenar en caché los metadatos de la tabla. Esto suele ser más rápido de acceder y menos costoso que obtener los metadatos directamente desde la base de datos.

La documentación de Zend_Db_Table incluye información sobre el almacenamiento en caché de metadatos.

F.3.1.2. Codificar directamente los metadatos en la definición de la tabla

A partir de la versión 1.7.0, Zend_Db_Table también ofrece soporte para codificar directamente los metadatos en la definición de la tabla. Este es un caso de uso avanzado, y solo debería usarse cuando sepa que el esquema de la tabla es poco probable que cambie, o que es capaz de mantener las definiciones actualizadas.

F.3.2. El SQL generado con Zend_Db_Select no está aprovechando mis índices; ¿cómo puedo mejorarlo?

Zend_Db_Select es relativamente bueno en su tarea. Sin embargo, si está realizando consultas complejas que requieren joins o subconsultas, a menudo puede resultar bastante ingenuo.

F.3.2.1. Escriba su propio SQL optimizado

La única respuesta real es escribir su propio SQL; Zend_Db no requiere el uso de Zend_Db_Select, por lo que proporcionar sus propias sentencias SQL select optimizadas es un enfoque perfectamente legítimo,

Ejecute EXPLAIN en sus consultas, y pruebe una variedad de enfoques hasta que pueda aprovechar de forma fiable sus índices de la manera más eficiente posible, y luego codifique directamente el SQL como una propiedad o constante de clase.

Si el SQL requiere argumentos variables, proporcione marcadores de posición en el SQL, y utilice una combinación de vsprintf() y array_map() para inyectar los valores en el SQL:

// $adapter is the DB adapter. In Zend_Db_Table, retrieve
// it using $this->getAdapter().
$sql = vsprintf(
    self::SELECT_FOO,
    array_map(array($adapter, 'quoteInto'), $values)
);