Pros y contras de MySQL

MySQL es una de las bases de datos más populares que hay dentro del desarrollo web. Hay gente que la defiende, y otros que no la tienen entre sus BD favoritas. Para aquellos que tengan que decidirse en la elección de MySQL como BD de su sistema, esta lista de pros y contras le puede ser de mucha utilidad.

Pros

  • Es muy popular: el hecho de que mucha gente la use y que esté tan presente en gran parte de los desarrollos web, hace que los proveedores de software intenten que sus aplicaciones sean compatibles con esta BD, pudiendo así encontrar muchas aplicaciones para MySQL.
  • Es simple: es fácil de aprender comparada con otras BDs, no es necesario emplear mucho tiempo o dinero en formar a los trabajadores o en contratar a gente cualificada. El que sea sencilla conlleva que también sea rápida, aunque hay algunos desarrolladores que echan en falta algunas funcionalidades (a mi parecer, cada vez menos).
  • Es barata: aunque pertenece a MySQL AB, MySQL es open source, que sea barata implica que al inicio del proyecto el gasto vaya a otras partes que puedan necesitarlo, en vez de gastar dinero en licencias.
  • Tiene soporte: uno de los inconvenientes que suelen presentar los clientes hacia el open source es que no dispone de soporte. MySQL ofrece licencia con servicios de soporte y mantenimiento, además también es posible obtener atención técnica 24/7.
  • Es flexible y escalable: dispone de muchos tipos de almacenamiento, pudiendo seleccionar el que más nos convenga, y os procedimientos almacenados nos permiten escalabilidad.
  • Librerías nativas para lenguajes: ofrece librerías para lenguajes como PHP y Ruby.

Contras

Yo no estoy personalmente de acuerdo con todas ellas, pero quien escribe el artículo tiene sus razones para indicarlas y hay que tenerlas en cuenta.

  • Licencia GPL: en algunos entornos, la licencia BSD es más adecuada.
  • Falta de integración con entornos existentes: existen muchas circustancias en los que los DBA no tienen un entorno con el que tratar con MySQL.
  • Falta de madurez: en comparación con otras BDs como Oracle (que cumple 30 años), le falta madurez, lo que indica posicionamiento y estabilidad.
  • Falta de características: hay características importantes, que aunque a veces no son muy utilizadas, pueden acabar con un proyecto debido a la necesidad de uso.
  • Certificación: a muchas empresas les gusta la certificación, aunque ofrecer certificación, esta está muy lejos de parecerse a la de Oracle o MS-SQL Server.

Five Compelling Reasons to Use MySQL

Eight Sound Reasons Not to Use MySQL

Vía / dzone

|

10 consejos para mejorar tus queries MySQL

10 interesantes consejos a seguir para mejorar nuestras sentencias en MySQL, algunas de ellas para poder optimizar las ya creadas.

  • Usa el comando explain: el comando explain te puede ayudar a identificar los índices que se usan y además te proporciona más información útil.
  • Usa permisos menos complejos: usar permisos más sencillos evita que se comprueben muchas condiciones en cada ejecución de una sentencia.
  • Comando benchmark: este comando nos permite saber cuánto tiempo tarda en ejecutarse una expresión.
  • Optimiza tus cláusulas: ya sea quitando paréntesis innecesarios, usando count(*) sin condiciones en el where ya que tira de tablas internas de MyQSL o usando la opción SQL_SMALL_RESULT para usar tablas temporales en memoria.
  • Ejecuta optimize table: defragmenta una tabla después de varios borrados, el acceso a disco es algo importante a tener en cuenta.
  • Evita campos de longitud variable: en tablas de frecuente actualización evita campos como VARCHAR, BLOB o TEXT.
  • Usa insert delayed: solo cuando sea no importe cuando se inserten los datos.
  • Prioridades en las sentencias: usa INSERT LOW_PRIORITY para darle a las consultas mayor prioridad, o usa SELECT HIGH_PRIORITY para ejecutar una consulta aunque haya otros clientes esperando.
  • Haz múltiples inserciones en una única sentencia: en vez de varias sentencias de una única inserción.
  • Sincroniza tipos de datos: mismos datos en tablas diferentes deben ser del mismo tipo de datos.

Yo siempre he tenido una duda, que no he resuelto por pereza, sobre el caso de ejecutar count(*) o count(1). La leyenda urbana dice que es mejor count(1), ya que de la otra forma obtienes que enviar todas las columnas, al igual que haces en un select *. Un consultor en Oracle nos dijo que era falsa esa afirmación porque tardaba lo mismo, yo creo que también, entre otras cosas porque seguro que ese punto está optimizado, pero claro, que sea consultor o que sea de Oracle no quiere decir nada, y menos aún si hablamos de otras bases de datos.

10 tips for optimizing mysql queries

Vía / Alex Sancho

MySQL Migration Toolkit

mysql.pngEl otro día nos preguntaban una forma de migrar una base de datos Access a otra MySQL. En ese momento no conocía ninguna aplicación que pudiera hacerlo, pero hoy me he enterado que los propios de MySQL tienen MySQL Migration Toolkit, que permite mediante una serie de pasos realizar una migración de forma correcta.
mysql_migration.png
Entre las base de datos que podemos migrar nos encontramos: Oracle, Microsoft SQL Server, Microsoft Access y otras. A parte reduce riesgos usando una metodología, ahorra costes incrementando la productividad, elimina días de trabajo de querys manuales, test y debug.
He visto también en en artículo desde el que hacemos referencia, que MySQL Workbench, del que hicimos referencia en su día, no está disponible para su descarga como lo estaba anteriormente, esperemos que sea porque anden mejorando este producto.
MySQL Migration Toolkit
Vía / Conexiones Razonables

Replicación en MySQL

Replicar una base de datos MySQL puede sonar a algo muy complicado, resulta más sencillo siguiendo el siguiente artículo que pasamos a comentar. Se trata de una de las base de datos (master) hacer que genere un log y otra (slave) lo lea.

Lo primero es añadir las siguientes líneas al fichero my.conf:

log-bin=<nombre-fichero-log>
binlog-do-db=<nombre-base-datos>
server-id=<numero-servidor>

El nombre de la base de datos si que debe ser el mismo en ambos servidores, los otros dos pueden ser cualesquiera, aunque el nombre del log suele ser el de host seguido de “-bin” y el id del servidor suele ser “1” para el maestro y “2” para el esclavo.

Después debes crear un usuario el cual se usará para replicarse con el esclavo:

GRANT REPLICATION SLAVE ON *.* TO '<usuario>'@'%' IDENTIFIED BY '<contraseña>';

También se puede usar el nombre del servidor esclavo en vez de %. Una vez creado el usuario, actualizamos los datos mediante FLUSH PRIVILEGES y FLUSH TABLES.

Si ejecutamos SHOW MASTER STATUS nos devuelve unos datos que son importantes para la replicación, sobre todo la columna File y la columna Position.

Una vez que el maestro ya está configurado, podemos empezar con la configuración del esclavo, eso sí, antes del inicio de la replicación ambas bases de datos deben tener la misma información. Para configurar el esclavo deberemos modificar su my.conf de la siguiente forma:

server-id=<numero-servidor>

siendo el número distinto al que usamos en el maestro, en nuestro ejemplo el maestro era “1” y el esclavo “2”. Después deberemos ejecutar la siguiente sentencia:

CHANGE MASTER TO MASTER_HOST='<servidor-maestro>', MASTER_USER='<usuario-replicacion>', MASTER_PASSWORD='<contraseña-replicacion>', MASTER_LOG_FILE='<fichero-log>', MASTER_LOG_POS=<posición-log>;

Y ya por último reiniciamos MySQl, paramos el esclavo(STOP SLAVE), cargamos los datos del maestro (LOAD DATA FROM MASTER) y arrancamos el esclavo (START SLAVE).

MySQL replication

Vía / PixelGroovy

|

MySQL nativo para PHP

mysql.pngLa gente de MySQL ha sacado a la luz unos drivers nativos de su base de datos para PHP. Una alternativa que solo funciona para PHP 6 y MySQL 4.1 o superior.

mysqlnd, que es como se llama esta librería, es una sustitución de libmysql, pero no tienen intención de dejar de dar soporte a libmysql para evitar que aplicaciones anteriores fallen. Pero ofrecen novedades a tener en cuenta:

  • La licencia es PHP license, evitando posibles problemas de licencias.
  • mysqlnd a nivel C usa muchas funciones internas estables de PHP.
  • Todas las librerías esta almacenadas en el directorio ext/mysqli, por lo que no es necesario enlazar a librerías externas. Así como no es necesario tener instalado el cliente de MySQL para compilar PHP con soporte para MySQL.
  • El rendimiento ha sido mejorado en varias zonas.

De todas formas, esta primera versión no está completa y se solo se han desarrollado las siguientes funcionalidades: conexiones persistentes, mysqli_fetch_all() y mysqli_get_cache_stats().

MySQL native driver for PHP: mysqlnd-5.0.0-alpha

Vía / Plante PHP

Crear un túnel SSH al servidor MySQL

Muy buen truco para crear un túnel SSH a un servidor MySQL y así poder usar el administrador de MySQL como si fuera en localhost, permitiendo así las opciones que añade para conexiones en local.
Para realizarlo es necesaria la aplicación PuTTY, un cliente Telnet/SSH gratuito, y el MySQL Administrator, aunque por lo que he entendido es válido para cualquier acceso a la BD.
Lo que conseguimos con el túnel SSH es acceder a una dirección, en este caso la 127.0.0.1:3306 (el puerto por defecto de MySQL en la máquina a la que accedemos), mediante un nuevo puerto (en el ejemplo el 8600). Así, cuando queramos acceder como si fuera localhost pero en un servidor remoto, tan solo deberemos acceder a 127.0.0.1:8600 desde el MySQL Administrator.
Securing the connection between MySQL and MySQL Administrator using an SSH tunnel
Vía / Digg

Optimizar MYSQL seleccionando correctamente los tipos de los campos

Algo muy importante para desarrollar una aplicación web es diseñar correctamente la base de datos MySQL, en este caso los tipos de los campos.
Algunos errores que se suelen cometer es por ejemplo usar texto para almacenar cantidades de dinero porque aparece el carácter de la moneda, cuando lo más lógico es formatear el valor obtenido en la base de datos en tus páginas.
Por ello lo primero es saber qué tipo de campo vamos a usar, numérico o texto, y luego saber qué subtipo seleccionar. Debemos tener en cuenta dos factores, cuánto espacio en disco ocupa y cuánto tiempo de proceso requiere.
Por ello, no es lo mismo seleccionar un CHAR que un VARCHAR, CHAR tiene ancho fijo, pero VARCHAR es más rápido de procesar, debemos tener en cuenta si nuestra base de datos va a ocupar poco o si necesita rapidez y actuar en consecuencia seleccionando el tipo correcto para los campos de las tablas.
Leed más, sobre todo la comparativa de tipos de campos, en el siguiente artículo.
Making your MySQL Tables More Effeciant by Using Correct Fieldtypes
Vía / dzone

Identificar queries lentas en MySQL

Algo muy importante a la hora de desarrollar un proyecto es identificar los puntos que ralentizan la devolución de la página web. Algo que suele provocar esta demora son las sentencias SQL lentas.

En el artículo al que hacemos referencia, explica paso a paso cómo encontrar las queries más lentas. Para ello primero se comprueba si se muestran los logs de sentencias lentas y si no es así, las modificaciones que hay que realizar para que se muestren. Después nos explican el significado de los logs y una utilidad para tratarlos.

Estos consejos solo son válidos para Unix, los usuarios de Windows deberán usar los logs de la aplicación para detectar el punto donde tarda en ejecutarse y luego mediante la sentencia EXPLAIN
estudiar la ejecución de las consultas.

Identifying MySQL slow queries

Vía / dzone

| |

Escritura el campos blob en MySQL y PHP

Muy buen artículo que explica cómo almacenar imágenes en campos blob usando MySQL y PHP, el post explica realmente cómo crear galerías de imágenes almacenándolas en campos blob. Yo personalmente no soy muy partidario de esta opción, cuando realmente se debería guardar la ruta de la imagen en el servidor y que el servidor web se encargue de enviar la imágen, ya que si no, lo que hacemos es hacer trabajar bastante a la BD.
De todas formas, el artículo puede sernos útil para saber como almacenar en este tipo de campos, porque aunque el ejemplo no sea del todo correcto, en alguna ocasión si que vamos a necesitar guardar datos en campos blob.
Muy bien explicado, añade conceptos básicos de protección por contraseña, actualización y borrado de imágenes, a parte de un par de consejos sobre los problemas que nos podemos encontrar con la capacidad máxima que se permite subir al servidor usando PHP.
PHP MySQL example: image gallery (blob-storage)
Vía / Good PHP Tutorials

SQLyog: administrador para MySQL

webyog.pngSiempre está bien conocer aplicaciones de administración de base de datos para MySQl. Esta vez se trata de SQLyog, la cual antes era de pago, y ahora es opensource.
Yo al menos no la conocía, pero tiene muy buena pinta. Tiene la mayoría de las características que se esperan de una aplicación de este estilo, pero si ves que se queda corta, hay una versión Enterprise que dispone de otras características añadidas.
SQLyog
Vía / Bitelia