jueves, 8 de abril de 2010

Cuando Usar Indices en una Tabla de MySQL

La creación de indices es algo que se discute casi siempre en los nuevos proyectos y es algo que se debe considerar cuando se diseña una base de datos.

Cuando se decide cuando y como crear un indice en tu base de datos de MySQL, es importante considerar como se esta siendo usada la data.

Digamos que tienes una tabla de empleados, creada de la siguiente manera:

CREATE TABLE empleados (
codigo INT,
nombre VARCHAR(60),
sueldo decimal(10,2),
fecha contrato(date)
)


Notaras que esta tabla es bien simple y que realmente no contiene toda la información que necesitas para administrar empleados, pero es solo para demostración, y si deseas puedes agregar mas campos mas tarde.

Por el momento usaremos esta tabla como ejemplo.

El código es básicamente un numero (INT) el cual puede guardar un numero grande. Si esto fuera el mundo real probablemente lo harías sin firmar, para que nunca tengas un numero negativo de código de empleado.

Aunque INT este sin firmar puede guardar hasta 2,147,483,647.

Quizás tengas la idea de hacer el campo auto incrementado y que sea clave primaria, el auto incrementado depende en como la data sera ingresada en la base de datos.

Nombre es un varchar simple de 60 el cual es suficiente para cubrir la mayoría de nombres de personas.

Sueldo es un campo decimal con dos dígitos para el decimal. Esto debería manejar un sueldo de hasta 99,999,999.99 .

Fecha contrato sera una fecha en formato AAAA-MM-DD.

Entonces considerando esta simple tabla donde esperarías que se coloque un indice? Si se asigna el código como clave primaria, entonces no se necesita indice ahí.

Es mejor usar indices en las columnas que se usan frecuentemente en la clausula WHERE y también en la clausula ORDER BY.

Tambien deberías prestar atención en si esa información sera actualizada frecuentemente o no ya que esto haría lento el proceso de insertar y actualizar. Como los empleados no se ingresan frecuentemente no necesitas preocuparte por eso.

Supón que estas buscando a los empleados usando una interfaz web PHP y el usuario final los buscara por nombre ya que por código seria un poco pesado.

Esto suena a que en esta situación es bueno usar indices:

A – No se actualizara el nombre de empleado frecuentemente.

B – Usaras el nombre de empleado en la clausula WHERE, asi:

select * from empleados where nombre ='perez';


C – Generaras reportes, que probablemente sean alfabeticos, como esto:

select * from empleados order by nombre asc;


Entonces en este ejemplo simple es fácil ver cuando sera importante usar indices:

create index nombre_index on empleados (nombre);


Quizás estés trabajando en una base de datos mas compleja, por eso es necesario recordar estas reglas sencillas:

  • Los indices hacen lento la inserción y actualización de los registros.
  • Los indices aceleran las clausulas WHERE y ORDER BY.

Recuerda pensar en COMO tu data sera usada cuando creas tus tablas.

Hay algunas otras cosas que se deben recordar. Si tu tabla es muy pequeña, por ejemplo, pocos empleados, seria peor usar indice que dejar a que se haga un escaneo de la tabla. Los indices solo son útiles cuando la tabla tiene muchos registros.

3 comentarios:

Anónimo dijo...

Mal copiado y (muy) mal traducido de aquí: http://www.howtoforge.com/when-to-use-indexes-in-mysql-databases.

¿Qué te costaba citar el original?

Daniel Cabrera dijo...

Hola,

Puedes indicar cuales son los errores para su corrección. Si vas a poner una critica deberías también indicar cual es para que se pueda corregir.

Saludos.

Anónimo dijo...

muy buen trabajo! gracias, pero si es verdad que es un repost no seria malo poner la fuente, al final el trabajo de traduccion es tambien un trabajo....