* 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
Publicado el 09 Abr, 2011