10 cosas que hacer antes de instalar MySQL

Buen artículo en el que se nos ofrecen 10 cosas que hay que tener en cuenta cuando vamos a instalar MySQL. En muchas ocasiones la gente se conforma con instalar la base de datos, meter los datos y ya está, cuando realmente hay cosas muy importantes en las que fijarse:

  • Comprender el propósito y el crecimiento potencial de la base de datos.
  • Determinar una capa física adecuada, los parámetros por defecto no son siempre los mejores.
  • Seleccionar un motor de almacenamiento adecuado y pensar que impacto puede tener en el rendimiento y las estrategias de backup y recuperación.
  • Planifica tu estrategia de copias de seguridad y recuperación. Elige las herramientas adecuadas para tu entorno.
  • Comprende el número de bases de datos que serán creadas y el mantenimiento.
  • ¿Cual es el coste y las ramificaciones del entorno?, realiza un análisis adecuado.
  • Piensa en la seguridad con la que serán tratados los usuarios y las bases de datos.
  • Elige un SQL_MODE adecuado, con la seguridad de que comprendes las consecuencias de esa elección.
  • Ten en cuenta la capa física de almacenamiento: limitaciones, escalabilidad y rendimiento de usar discos separados, arrays de discos, …
  • Define prácticas correctas para determinar nomenclaturas, herramientas de administración, administración de infraestructuras y documéntalo todo.

Top Ten Things to do before installing MySQL

|

WWW SQL Designer: diseño de bases de datos online

WWW SQL Designer es una aplicación online que nos permite editar nuestro propio modelo de datos y exportarlo a diferentes bases de datos como MSSQL, MySQL, Oracle o PostgreSQL. A parte permite exportar a XML, importar a XML, guardar directamente en base de datos y leer desde base de datos.
sqldesign.png
La creación de las tablas y de las relaciones entre ellas es sencillo, para las relaciones solo es necesario desplazar la PK en una tabla y el campo y la relación se crearán automáticamente.
La aplicación se puede descargar y nos permite guardar nuestros trabajos. La interfaz me ha gustado mucho ya que permite mover las tablas, las relaciones se redibujan cuando las tablas se organizan, tiene una pantalla de zoom para movernos a la posición que queramos y la edición de los campos y tablas es muy sencillo.
WWW SQL Designer
Vía / DbRunas

Pruebas de rendimiento en MySQL

Algo muy importante en cualquier desarrollo web son las pruebas de rendimiento, con ellas podremos prever cuales son los límites de nuestro sistema, ya sean a nivel de software o hardware. Las bases de datos deben ser algo fundamental en estas pruebas.

En el caso de MySQL, existe una herramienta disponible desde la versión 5.1.4 que nos permite realizar estas pruebas. mysqlslap es un programa de diagnóstico diseñado para emular la carga de un cliente para un servidor MySQL y ofrecer informes para cada estado. Funciona como si múltiples clientes accedieran a nuestro servidor.

mysqlslap [opciones] nombre_base_datos

Da la posibilidad de que las sentencias SQL se generen automáticamente, pero para unas pruebas correctas de rendimiento se deberían usar las sentencias que ejecuta nuestro sistema. Para lo cual recomiendo sacar por trazas las sentencias en un fichero y usar luego este fichero para simular a un usuario.

Hay que tener en cuenta que cuando lee un fichero usará para delimitar las queries el retorno de carro, por lo que cada query deberá ir en una única línea, aunque se puede usar la opción –delimiter para indicar la cadena delimitadora.

Son también importantes los campos –concurrency e –iterations, el primero indica el número de clientes simultáneos, y el segundo las veces que se ejecuta la prueba.

También es recomendable usar la aplicación jMeter para realizar nuestras pruebas.

Consejos iniciales para MySQL

Una serie de consejos para aquellos que empiezan con MySQL o que vienen de usar otra base de datos.

  • Motores de almacenamiento: los storage engines son podríamos decir que tipos de tablas, y la elección de estos puede ser fundamental, ya que algunos poseen características que otros no tienen, por ejemplo InnoDB tiene constraints de claves secundarias.
  • Escalado (scale-out vs scape-up): el escalado puede ser de dos tipos scale-out que se refiere a la capacidad de mejorar el servidor, y scale-up que es la capacidad de añadir más servidores. MySQL realiza mejor el scale-out que el scale-up.
  • Copias de seguridad: para realizar las copias de seguridad se usa el comando mysqldump, aunque si dispones de Linux puedes usar LVM, o también puedes usar la replicación.
  • Permisos: no existen los roles, los permisos se crean a partir del USERID.
  • Collations: por defecto, si se comparan strings no son sensibles a mayúsculas minúsculas (a=A).
  • Autocommit: activo por defecto.
  • Optimización: es recomendable usar los logs de las slow queries para ver qué va mal en nuestro sistema.
  • SQL_MODE: si estás preocupado por la integridad de los datos, deberás leer información sobre el SQL_MODE.
  • Isolation levels: importante leer sobre los isolation levels ya que tiene distinto comportamiento que en otras bases de datos como Oracle.

tips for MySQL newbies

Usar auto_increment para claves en MySQL

El uso de claves primarias con auto_increment en MySQL se debería tener en cuenta cuando el valor de la clave no es importante. Esto es, por ejemplo si tenemos una tabla de empleados y consideramos que la clave primaria es el número de empleado o el número de indentidad del ciudadano, pues quizás no sea buena idea usar auto_increment. Pero si la clave va a ser un número aleatorio, el valor no importa, el uso de auto_increment sería lo más adecuado.

Para definir una tabla con clave primaria con auto_increment, deberías ejecutar la siguiente sentencia:

create table `empleados` (
`id` int (10)   NOT NULL AUTO_INCREMENT ,
`nombre` varchar (250)   NOT NULL ,
`correo` varchar (250)   NOT NULL  ,
PRIMARY KEY ( `id` )  )

Con esta tabla, cuando insertemos un nuevo dato no se debe indicar el ID, ya directamente MySQL lo asignará.

El problema suele ser que muchas veces, cuando insertamos un registro, necesitamos la clave del registro nuevo para usarlo en la inserción en otra tabla relacionada. Por lo que si usamos el auto_increment, a priori no seremos capaces de saber cuál es el valor. En estas circunstancias deberemos usar la sentencia LAST_INSERT_ID(), la cual nos devolverá el ultimo id insertado, pero hay que tener cuidado con esto, porque con la concurrencia podemos obtener resultados no deseados.

También se puede reinicializar el valor del auto_increment, pero teniendo en cuenta que no se puede usar un valor menor o igual que uno que ya se haya usado. Por lo que habrá que tener cuidado en las exportaciones.

alter tabla tabla auto_increment=50;

mysqlpdump: backup de MySQL multi-thread

El tema de realizar las copias de seguridad de una base de datos en MySQL suele ser un problema debido a la cantidad de recursos que puede necesitar si las BDs ocupan mucho espacio.
Para solucionar algo este problema existe la aplicación mysqlpdump, la cual realiza en paralelo la copia de seguridad de cada tabla, siendo esto muy beneficioso en los servidores con más de una CPU.
Un ejemplo de eficiencia que comentan es una BD de 300G que tarda en realizar la copia de seguridad en 3 horas y media.
Por defecto, se crean ficheros independientes para cada tabla, incluso se puede sacar la salida por pantalla, algo nada recomendable.
Se requiere Python 2.5 y el módulo MySQL-python.
mysqlpdump
Vía / MySQL-HA

myisamchk: comprobar y reparar tablas MYISAM en MySQL

Generalmente las tablas se vuelven corruptas cuando el servidor tiene un problema crítico y finaliza el servicio o cuando las tablas no se cierran correctamente. Siendo los ficheros de índices (.MYI) y los de datos (.MYD) los que están corruptos y los que hacen que no se sincronicen correctamente.

Normalmente se puede comprobar el estado y reparar una tabla mediante dos simples instrucciones MySQL:

CHECK TABLE tabla;
REPAIR TABLE tabla;

Pero esto no es siempre efectivo, conociéndose casos en el que no lo repara del todo o que dice que la reparación ha sido un éxito pero realmente no ha sido así. Por ello el mejor método para reparar una tabla corrupta es usar el comando de MySQL myisamchk, recomendando siempre parar el servidor corrupto para realizar la reparación.

myisamchk [opciones] ./data//.MYI

Aunque la manera más rápida de comprobar las tablas es con las opciones –silent y –fast, la mejor opción para una recuperación completa es –safe-recover, aunque lógicamente toma mucho tiempo.

Vía / Whatever….

20 recursos MySQL

Una buena lista de aplicaciones, enlaces, recursos, tutoriales sobre MySQL que nos pueden ayudar a trabajar con esta base de datos.

Herramientas de diseño y administración

  • MyDB Studio: aplicación para administracion de MySQL con alguna utilidad para diseño.
  • SQLYog: excelente GUI para diseño y administración de bases de datos MySQL.
  • WWW SQL Designer: diseñador Ajax, tiene muchas características que normalmente solo están disponibles en aplicaciones offline.
  • OpenOffice.org Base: aunque es inusual, realmente tiene un buen soporte para trabajar con MySQL.
  • AutoMySQLBackup: para la creación de scripts para realizar backups.
  • PHPMyAdmin: el más famoso de los administradores de MySQL vía web.

Herramientas de seguridad

  • SQLIer: Herramienta para SQL Injection que indicando una URL, intenta hacer todo lo posible para realizar SQL Injection.
  • SQLMap: Otra utilidad para SQL Injection que admite MySQL, PostgreSQL y MSSQL.
  • Absinthe: utilidad disponible para Linux y Windows que intenta forzar tu servidor con ataques SQL injection.
  • SQID: SQL Injection mediante línea de comandos creado con Ruby.

Optimización

Conocimientos

20 Indispensible MySQL Resources

Vía / dzone

MySQL Index Analyzer: analiza los índices de MySQL

MySQL Index Analyzer es una sencilla aplicación creada en Java que nos analiza los índices de una base de datos en MySQL. Comprueba qué índices no son útiles desde la perspectiva de la BD.
mia.png
Por ejemplo, para todas índices de las tablas que cubre los campos que son primary key, en este caso es útil porque este índice no se usará nunca por el optimizador.
A parte de un informe, nos devuelve scripts para resolver los problemas.

MySQL Index Analyzer

Consejos MySQL

El problema que tenemos muchos a la hora de desarrollar es no profundizar en las características que nos ofrece una herramienta. En este caso, solemos realizar una serie de consultas en MySQL que se podrían optimizar para que fuera todo más rápido.

Búsqueda de palabras

/* Muy rápida */
SELECT * FROM tabla WHERE MATCH (`campo`) AGAINST ('palabra')
/* Rápida */
SELECT * FROM tabla WHERE MATCH (`campo`) AGAINST ('+palabra' IN BOOLEAN MODE)
/* Lentas */
SELECT * FROM tabla WHERE RLIKE '(^| +)palabra($| +)'
/* o */
SELECT * FROM tabla WHERE
RLIKE '([[:space:]]|[[:<:]])palabra([[:space:]]|[[:>:]])'

Búsquedas contenidas

/* Muy rápida */
SELECT * FROM tabla WHERE MATCH (`campo`) AGAINST ('palabra*' IN BOOLEAN MODE)
/* Rápida */
SELECT * FROM tabla WHERE FIELD LIKE 'palabra%'
/* Lentas */
SELECT * FROM tabla WHERE MATCH (`campo`) AGAINST ('*palabra*' IN BOOLEAN MODE)
/* o */
SELECT * FROM tabla WHERE campo LIKE '%palabra%'

Número de registros

/* Muy rápida */
SELECT SQL_CALC_FOUND_ROWS * FROM tabla WHERE condición LIMIT 0, 10
SELECT FOUND_ROWS()
/* Rápido */
SELECT * FROM tabla WHERE condición LIMIT 0, 10
SELECT COUNT(clave) FROM TABLE WHERE condición

Lo más lento es recuperar los registros y luego un script (PHP por ejemplo) contarlos.

PHP Mysql tips

Gracias diarioTHC por el enlace