MySQL: La Base de datos perfecta

 

Bien, para crear la base de datos perfecta, primero debemos de tener muy claro cual va a ser su función, es decir, qué tipo de aplicativo vamos a darle a la misma. ¿Será la base de datos de un foro?, ¿será la base de datos de un blog?, dependiendo de su utilidad encontraremos cual será la mejor manera de crearla.

En MySQL existen varios tipos de tablas, entre ellas están:

  • Isam
  • MyIsam
  • InnoDB
  • DBD (Berkley Database)

Entre estas hay que destacar dos de ellas, que a mi entender son las mejores para este proyecto, estas son MyIsam e InnoDB. Cada una de ellas tiene diferente manera de estructurar sus tablas y las posibilidades cambian.

Diferencias entre InnoDB y MyIsam

Las tablas de InnoDB se almacenan en un único archivo a diferencia de las MyIsam que lo hacen en tres. La mayor diferencia es que InnoDB permite realizar transacciones y claves foráneas, lo que aporta una fiabilidad extra frente a MyIsam, pero esta última es más rápida en cuanto a consultas se refiere.

Por lo tanto una tabla InnoDB te permitirá hacer consultas y subconsultas, también tendrás la posibilidad de crear triggers que son pequeñas instrucciones que se ejecutan cuando se actualiza, crea o eliminan registros de una tabla en concreto.

Las tablas MyIsam son mucho más rápidas consultando registros porque no pierden tiempo en relaciones ni controles, pero sin embargo las InnoDB son más rápidas realizando instrucciones como Insert, Update o Delete.

Teniendo en cuenta estas observaciones, nos damos cuenta que por ejemplo:

  • Para crear una base de datos para un foro, la mejor estructura es InnoDB, puesto que las tablas se deben de actualizar más con nuevos registros y las consultas a realizar son más constantes, aunque sea más lenta, merece la pena.
  • Para crear un blog, donde se añadirán un par de registros por día, la mejor opción es MyIsam, puesto que lo único que debemos de hacer es consultar y extraer datos.

Los índices son importantes:

Otra opción a tener muy en cuenta es la creación de índices, todos sabemos que son fundamentales, y de hecho aceleran mucho las consultas, pero si los usamos en exceso puede perjudicar radicalmente el rendimiento de nuestra aplicación.

Un índice es un fichero que se almacena de forma externa a nuestra tabla donde tenemos la información exacta de dónde está cada fila, y que dato vamos a consultar de ella. Por lo tanto, cuando llega el momento de hacer una consulta, buscar en un índice nos ahorra mucho tiempo, ¿pero que pasa si esta tabla se actualiza constantemente?.

Cada vez que actualizamos la tabla, el índice se recompone y vuelve a crearse, si esta situación se repite constantemente, el índice no servirá de nada, es más estará perjudicando el rendimiento general de la aplicación, puesto que su creación estará consumiendo recursos de la máquina de manera constante.

Debemos de crear índices en los campos que vayamos a consultar, por ejemplo, si tenemos una tabla con comentarios de nuestro blog, debemos de pararnos a pensar por cual de los campos vamos a extraer estos, seguramente la estructura sería algo parecido a esto:

IdComentario (Int) AutoIncremental
IdArticulo (Int)
Titulo (char)
Fecha (DateTime)
Comentario (Text)

Si necesitamos extraer los comentarios de un artículo, la consulta necesitará el campo (IdArticulo) para relacionarlos, entonces el índice a crear sería IdArticulo, también sabemos que ordenaremos estos comentarios según la fecha de entrada, pero como no se consulta por ellos, no es necesario crear un índice para este campo.

Otro problema es cuando creamos índices FullText, este tipo de índices tan solo se pueden crear en tablas MyIsam, lo que hacen es almacenar el texto de un campo en concreto para acelerar sus búsquedas, pues bien, si tenemos un índice sobre un campo de 200 caracteres, seguramente utilizaremos 20 como máximo para buscar lo que nos interesa. En vez de crear un índice de la totalidad del campo, podemos crearlo sobre los primeros 20 caracteres.

¿Utilizas sentencias Inner Join en tus consultas?, ¿estas sentencias se repiten de manera asidua en tu aplicación?, si la respuesta es Sí, añade un índice en los campos de comparación, si es No, lo mejor será que no los añadas, perderás en rendimiento (milisegundos), pero no perjudicarás el rendimiento general.

Estructura las tablas

Una buena estructuración de las tablas servirá de mucho cuando llegue el momento de poner en marcha esa base de datos, evita insertar campos inútiles en la misma tabla, siempre que puedas, crea una nueva y relaciónala mediante sentencias Inner Join.
Cada vez que consultas una tabla esta extrae la información, si con ella viaja información "poco útil" estarás consumiendo de más.

Extrae solo lo que necesitas, evita utilizar el asterisco (*) en tus consultas, si estás sacando información sobre un artículo, no hace falta que extraigas la fecha de actualización o campos que no vayas a mostrar, céntrate en lo que realmente necesita esa consulta.

Si eres de los que se vuelven locos creando macro consultas, fíjate bien en las relaciones que haces, indexa tan solo lo que vas a consultar y descarta el resto, a veces es mejor hacer un par de consultas rápidas que una super pesada.

Introduce siempre un timer para saber el tiempo de respuesta real, te servirá de referencia para saber que tarda cada una de ellas.

Espero que este artículo os haya servido de algo para mejorar la estructura de vuestra base de datos, solo decir que en nuestro caso tenemos diferenciadas las base de datos del foro que la que muestra estos artículos, y como no, el foro es InnoDB y esta es MyIsam, ¿habéis notado lentitud?, seguro que no ;)