Debido a que todos los servidores SQL implementan diferentes partes del estándar SQL, toma trabajo escribir aplicaciones SQL portables. Es muy fácil obtener portabilidad para selects muy simples y para inserts, pero es más difícil cuantas más funcionalidades se requieran. Obtener una aplicación que sea rápida en varios sistemas de bases de datos, es una tarea muy difícil.
Para hacer aplicaciones complejas portables, necesita determinar para cuáles servidores SQL debe trabajar, después determinar qué características soportan esos servidores.
Todos los sistemas de bases de datos tienen algunos puntos débiles. Esto es, tienen diferentes concesiones de diseño que conducen a comportamientos diferentes.
Puede usar el programa de MySQL crash-me para encontrar funciones, tipos y límites que puede usar con una selección de servidores de bases de datos. crash-me no comprueba cada posible característica, pero es razonablemente completo, puesto que hace cerca de 450 pruebas.
Un ejemplo de un tipo de información de la que el programa crash-me puede proveer es que no debería usar nombres de columnas que sean mayores de 18 caracteres si quiere que la aplicación funcione en Informix o DB2.
El programa crash-me y MySQL benchmarks son
independientes de la base de datos. Mirando por encima cómo
están escritos, puede hacerse una idea de qué debe hacer que
sus propias aplicaciones sean independientes de bases de datos.
Los programas se encuentran en el directorio
sql-bench
dentro del código fuente de la
distribución de MySQL. Estan escritos en Perl y usan la
interfaz para bases de datos DBI. Usar DBI ya soluciona una
parte de los problemas de portabilidad puesto que provee de
métodos de acceso independientes a las bases de datos.
Ver http://dev.mysql.com/tech-resources/benchmarks/ para los resultados de las mediciones.
Esforzarse para ser independiente del motor de bases de datos,
implica prestar atención a los cuellos de botella de cada
servidor SQL. Por ejemplo, MySQL es muy rápido obteniendo y
actualizando registros para tablas MyISAM
,
pero tiene un problema mezclando lecturas y escrituras lentas
sobre la misma tabla. Por otra parte, Oracle tiene un enorme
problema cuando intenta acceder a registros que se han
actualizado recientemente (hasta que se escriben en el disco).
Las bases de datos transaccionales en general no son muy buenas
generando resúmenes de tablas desde las tablas de registro
(log), puesto que en este caso el bloqueo (lock) de registros es
casi inútil.
Para hacer una aplicación realmente independiente de la base de datos, se necesita definir una interfaz fácilmente extendible a través de la cual se manipularán los datos. Puesto que C++ está disponible en la mayoría de los sistemas, tiene sentido usar una interfaz basada en clases de C++ hacia la base de datos.
Si usa alguna característica que es específica de algún
sistema de base de datos (por ejemplo la sentencia
REPLACE
, que es específica en MySQL),
debería implementar la misma característica para otros
servidores SQL codificando un método alternativo. Aunque la
alternativa sea más lenta, permite que la misma tarea se haga
en otros servidores.
Con MySQL, puede usar la sintaxis /*! */
para
agregar algunas palabras claves de MySQL a una consulta. El
código dentro de /**/
es tratado como un
comentario (e ignorado) por la mayoría de los otros servidores
SQL.
Si el alto rendimiento es más importante que la exactitud, como en algunas aplicaciones Web, es posible crear una capa de la aplicación que almacene en una cache todos los resultados para obtener un rendimiento mejor. Dejando que los resultados viejos expiren en determinado tiempo, puede mantener la cache razonablemente actualizado. Éste es un método para soportar picos de carga, al que se añade la posibilidad de implementar un incremento dinámico de la cache y un aumento del tiempo de expiración, hasta que las cosas regresen a la normalidad.
En este caso, la información de creación de la tabla debe contener información del tamaño inicial de la cache y de la frecuencia de refresco de la tabla.
Una alternativa para implementar una aplicación en cache es usar la cache para consultas de MySQL. Habilitando la cache para consultas, el servidor toma los detalles de las consultas determinando qué resultados pueden ser reutilizados. Esto simplifica la aplicación. Ver Sección 5.12, “La caché de consultas de MySQL”.
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.