* 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