El índice ideal debería tener las siguientes características:
• Los registros deberían ser lo más pequeños posible.
• Sólo se debe indexar valores únicos.
Analicemos cada recomendación:
• Cuanto más pequeños sean los registros, más rápidamente se podrán cambiar de lugar (al insertar, modificar o borrar filas), además, en un momento dado, el índice puede permanecer en memoria. Consideremos las dos definiciones posibles:
create table Empresa(
nombre char(30),
teléfono char(20),
index (nombre)
);
En esta tabla el índice se realiza sobre nombre, que es un campo de 30 caracteres, y se utiliza como clave para hacer los 'joins' con otras tablas.
Ahora considérese la siguiente alternativa:
create table Empresa(
id int ,
nombre char(30),
teléfono char(20),
index (id)
);
Se agrega una columna que servirá como identificador de la empresa. Desde el punto de vista de rendimiento implica una mejora, ya que el índice se realiza sobre números enteros, por lo tanto, ocupará menos espacio y funcionará más rápido.
Cuanto más pequeña sea la columna indexada mayor velocidad se tendrá en el acceso a la tabla.
• Consideremos el índice siguiente, creado para disminuir la necesidad de efectuar accesos a la tabla:
create table Empresa(
nombre char(30),
crédito enum{´SI´,´NO´},
index(crédito)
);
Si consideramos que un índice se crea para evitar la necesidad de recorrer la tabla, veremos que el índice creado es prácticamente inútil, ya que alguno de los valores ocurre el 50% o más de las veces: para encontrar todos los resultados hay que recorrer gran parte de la tabla. MySQL no utiliza los índices que implican un 30% de ocurrencias en una tabla.
Aun así, y exceptuando casos exagerados como este último, puede ser interesante indexar una tabla por algún atributo que no sea único, si ese atributo se utiliza para ordenar los resultados. También puede ser conveniente crear un índice por varios atributos simultáneamente si se usan todos en alguna consulta en la cláusula ORDER BY.
Cuanto menor sea la repetición de valores en una columna indexada, menor será la necesidad de acceder a la tabla y más eficiente será el índice.