Anda di halaman 1dari 4

5.5.1.

Indexacin
La indexacin es la principal herramienta para optimizar el rendimiento general de cualquier base de datos. Es tambin la ms conocida por los usuarios de servidores MySQL y, paradjicamente, su no utilizacin es una de las principales causas de bajo rendimiento en servidores de bases de datos. Muchos administradores y diseadores simplemente parecen olvidar usar ndices para optimizar los accesos a las bases de datos. Por otro lado, algunas personas tienden a indexar todo, esperando que de esta manera el servidor acelere cualquier tipo de consulta que se le solicite. En realidad, esta prctica puede causar una disminucin en el rendimiento, sobre todo en lo que respecta a inserciones y modificaciones. Para ver las ventajas de utilizar ndices, analizaremos en primer trmino una simple bsqueda en una tabla sin ndice alguno: El constante acceso de escritura de una tabla la mantiene desordenada.

La ordenacin de una tabla es una operacin costosa: el servidor tendra que detenerse un tiempo considerable para ordenar sus tablas. Muchas tablas tienen ms de un criterio de ordenacin: ordenar segn una columna implica desordenar otra. La insercin y eliminacin de datos sin alterar el orden en una tabla es costosa: la insercin de un registro en una tabla grande implicara una larga espera en la actualizacin de la misma. Si se opta por mantener la tabla desordenada (que es la opcin ms viable), una bsqueda implicara forzosamente un recorrido secuencial (tambin denominado full scan), registro por registro. El uso de ndices en la ordenacin de las bases de datos ofrece las ventajas siguientes: Permite ordenar las tablas por varios criterios simultneamente.

Es menos costoso ordenar un archivo ndice, porque incluye slo referencias a la informacin y no la informacin en s. El coste de insercin y eliminacin es menor.

Con los registros siempre ordenados se utilizaran algoritmos mucho ms eficientes que el simple recorrido secuencial en las consultas. El uso de ndices tambin comporta alguna desventaja: Los ndices ocupan espacio en disco.

An teniendo registros pequeos, el mantener en orden un ndice disminuye la velocidad de las operaciones de escritura sobre la tabla. A pesar de estos inconvenientes, la utilizacin de ndices ofrece mayores ventajas que desventajas, sobre todo en la consulta de mltiples tablas, y el aumento de rendimiento es mayor cuanto mayor es la tabla. Consideremos por ejemplo una consulta sobre las tablas A, B, y C, independientemente del contenido de la clusula where, las tres tablas se deben de combinar para hacer posible posteriormente el filtrado segn las condiciones dadas: select * from A,B,C where A.a = B.b

and B.b = C.c;

Consideremos que no son tablas grandes, que no sobrepasan los 1.000 registros. Si A tiene 500 registros, B tiene 600 y C 700, la tabla resultante de la consulta anterior tendr 210 millones de registros. MySQL hara el producto cartesiano de las tres tablas y, posteriormente, se recorrera la relacin resultante para buscar los registros que satisfacen las condiciones dadas, aunque al final el resultado incluya solamente 1.000 registros. Si utilizamos ndices MySQL los utilizara de una forma parecida a la siguiente: Tomara cada uno de los registros de A.

Por cada registro de A, buscara los registros en B que cumpliesen con la condicin A.a = B.b. Como B est indexado por el atributo 'b', no necesitara hacer el recorrido de todos los registros, simplemente accedera directamente al registro que cumpliese la condicin. Por cada registro de A y B encontrado en el paso anterior, buscara los registros de C que cumpliesen la condicin B.b = C.c. Es el mismo caso que en el paso anterior. Comparando las dos alternativas de bsqueda, la segunda ocupara cerca del 0,000005% del tiempo original. Por supuesto que slo se trata de una aproximacin terica, pero adecuada para comprender el efecto de los ndices en las consultas sobre bases de datos.

OPTIMIZANDO CONSULTAS MYSQL. CREANDO Y DEFINIENDO INDICES. MANAGE INDEX



Pedro Ventura Enero 30, 2011 1 comentario/s SQL Tags: mysql, tutoriales

Los ndices se utilizan para buscar las filas con valores de columna especfica rpidamente. Sin un ndice, MySQL debe comenzar con el registro primero y luego leer a travs de toda la tabla para buscar las filas correspondientes. Cuanto ms grande sea la tabla, ms tarda este proceso. Si la tabla tiene un ndice para las columnas que se trate, MySQL puede determinar rpidamente la posicin de buscar en el medio del archivo de datos sin tener que mirar todos los datos. Si una tabla tiene 1000 filas, entonces esto es por lo menos 100 veces ms rpido que la lectura secuencial. Todo esto puede conllevar que si una tabla tiene como Engine MyISAM puede lugar a bloqueos mientras sta se esta leyendo. Pues bien como indico los ndices aumenta la velocidad de la consulta y es crtico cuando tenemos un trfico medio-alto. Si los indices no estn bien configurados o no se tienen, puede ser problema de que nuestro mysql se bloque, toda la web vaya lenta o incluso que el servidor se bloque y haya que reiniciarlo o se caiga directamente. Normalmente un indice se crea dependiendo de la bsqueda que se haga, combinando lo que haya en la sentencia SELECT y WHERE. La sql para crear un indice es la siguiente.
1 CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name 2 [USING index_type] 3 4 5 index_col_name: 6 col_name [(length)] [ASC | DESC] ON tbl_name (index_col_name,...)

veamos ejemplos ms claros Si seleccionamos el identificador de usuario y el nick en una tabla usuarios buscando por el email, tendremos una sql como la siguiente;
1 select id,nick from users as Usuario where email ='pedro@domino.com';

Algo muy simple,no? Pues veamos que indices tiene asignados. Esto se puede comprobar poniendo delante de la sql la sentencia EXPLAIN.

explain select id,nick from users as Usuario ='pedro@domino.com';

where email

Esto nos puede mostrar algo como lo que viene en la siguiente imagen. Nota: en la sql original que arroja esta captura se hace un inner join compuesto con 4 tablas. Es en estos casos donde la sql puede tardar ms y donde es mucho ms necesario el uso de indices.

Sql explain. Pulsa para ver a mayor tamao Para modificar un indice se puede hacer de la siguiente manera
1 alter table users add index `idx_nick` (`nick_usuario`);

Donde idx_nick es el nombre del indice que estamos creando y nick_usuario el campo en la tabla que vamos a indexar. Para aadir un nuevo indice compuesto se puede hacer de la siguiente manera
1 alter table users add index `idx_logins` (`id`, `username`, `status`, `email`)

Esto puede dar lugar a veces a que el tamao del indice que estamos generando es demasiado grande. specified key was too long; max key lenght is 1000 bytes Para ello vamos ajustando el tamao que asignamos a cada campo para el indice.
1 alter table users add index `idx_logins` (`id`, `username`(200), `status`, `email`(100))

referencias: