ANALISIS Y OPTIMIZACIÓN DE TABLAS EN MYSQL

* Tres métodos para optimizar el rendimiento del sistema:
   - Mejorar la estructura de las tablas.
   - Mejorar las consultas (pero depende de cada aplicación).
   - Mejorar la configuración del servidor MySQL.

 * Las tablas desordenadas provocan búsqueda secuencial lenta. Pero una tabla
   ordenada también tiene su coste:
   - Ordenar una tabla desordenada es costoso.
   - Constante acceso de escritura desordena de nuevo los registros de la tabla.
   - La inserción y eliminación ordenada de registros es costoso.
   - Cuando ordenamos por una columna desordenamos el resto de columnas.

 * Creando índices conseguiremos consultas mucho más rápidas:
   - Es menos costoso de insertar. modificar y eliminar en un índice que hacerlo
     en toda una tabla ordenada.
   - Puedo tener varios índices de una tabla, lo que permite ordenar tabla por
     varios criterios a la vez.
   - Los índices ocupan espacio en disco y memoria, y las operaciones de
     inserción, modificación y borrado serán un poco más lentas (habrá que
     actualizar índices), por lo que no debemos indexar todas las columnas, sino
     sólo las más usadas en búsquedas.
   - Cuanto más pequeño es el índice más rápidas serán las operaciones.

?

 

 * Algunas sentencias se ejecutan mucho más eficientemente si hay índices:

     SELECT * FROM A,B,C WHERE A.a = B.b AND B.b = C.c;

   - Sin índices  ->  producto cartesiano + filtrado
   - Con índices  ->  A + (filtrado A.a = B.b) + (filtrado B.b = C.c)

 * Crear una nueva tabla con índices:
     CREATE TABLE nombre_tabla (definición, INDEX nombre_indice (campo(longitud)), ...);

   Ejemplo:
     CREATE TABLE `Alumnos` (
       `DNI` int(8) NOT NULL,
       `Nombre` char(35) NOT NULL,
       `Nota` int(2) NOT NULL,
       PRIMARY KEY (`DNI`),
       INDEX(`Nombre`) );

 * Crear un índice en una tabla ya existente (dos maneras):
     CREATE [UNIQUE] INDEX nombre_indice ON nombre_tabla (nombre_columna(longitud),...);
     ALTER TABLE nombre_tabla ADD INDEX nombre_indice (nombre_columna(longitud),...);

   Ejemplo:
     CREATE INDEX indice ON Alumnos (Nombre(10));
     ALTER TABLE Alumnos ADD INDEX (Nombre(10));

 * Borrar un índice en una tabla ya existente (dos maneras):
     DROP INDEX nombre_indice ON nombre_tabla;
     ALTER TABLE nombre_tabla DROP INDEX nombre_indice;

   Ejemplo:
     DROP INDEX indice ON Alumnos;
     ALTER TABLE Alumnos DROP INDEX Nombre;

 * Las consultas por columnas que pueden contener valores NULL son más lentas.

 * El rendimiento mejora si los registros de la tabla tienen longitud fija (sin
   campos de tipo VARCHAR, TEXT o BLOB). Si cada campo (columna) tiene una
   longitud fija entonces cada registro (línea) también tendrá una longitud fija.
   - Disminuye la fragmentación: los registros borrados son substituidos por
     registros de la misma longitud.
   - Aumenta la velocidad: los registros son accedidos por "número de registro"
     en lugar de "desplazamiento dentro del fichero".
   - Disminuye el consumo de memoria: el índice es más pequeño.

 * También se puede desfragmentar tablas para ganar espacio y velocidad:

     OPTIMIZE TABLE tabla;

 * Lecturas para profundizar:
   - http://dev.mysql.com/doc/refman/5.0/es/mysql-indexes.html
   - http://dev.mysql.com/doc/refman/5.0/es/create-index.html
   - http://dev.mysql.com/doc/refman/5.0/es/optimize-table.html
   - http://dev.mysql.com/doc/refman/5.0/es/optimizing-database-structure.html