Sie sind auf Seite 1von 4

Que es un ndice?

Un ndice (o KEY, o INDEX) es un grupo de datos que MySQL asocia con una o varias columnas de la tabla. En este grupo de datos aparece la relacin entre el contenido y el nmero de fila donde est ubicado. Los ndices -como los ndices de los libros- sirven para agilizar las consultas a las tablas, evitando que mysql tenga que revisar todos los datos disponibles para devolver el resultado. Podemos crear el ndice a la vez que creamos la tabla, usando la palabra INDEX seguida del nombre del ndice a crear y columnas a indexar (que pueden ser varias): INDEX nombre_indice (columna_indexada, columna_indexada2...) La sintaxis es ligeramente distinta segun la clase de ndice:
PRIMARY KEY (nombre_columna_1 [,nombre_columna2...]) UNIQUE INDEX nombre_indice (columna_indexada1 [,columna_indexada2 ...]) INDEX nombre_index (columna_indexada1 [,columna_indexada2...]) Podemos tambin aadirlos a una tabla despus de creada: ALTER TABLE nombre_tabla ADD INDEX nombre_indice (columna_indexada);

Si queremos eliminar un ndice: ALTER TABLE tabla_nombre DROP INDEX nombre_indice

para que sirven ?


LOs index permiten mayor rpidez en la ejecucin de las consultas a la base de datos tipo SELECT ... WHERE La regla bsica es pues crear tus ndices sobre aquellas columnas que vayas a usar con una clusula WHERE, y no crearlos con aquellas columnas que vayan a ser objeto de un SELECT: SELECT texto from tabla_libros WHERE autor = Vazquez; En este ejemplo, la de autor es una columna buena candidata a un indice; la de texto, no. Otra regla bsica es que son mejores candidatas a indexar aquellas columnas que presentan muchos valores distintos, mientras que no son buenas candidatas las que tienen muchos valores idnticos, como por ejemplo sexo (masculino y femenino) porque cada consulta implicar siempre recorrer practicamente la mitad del indice.

La regla de la izquierda
Si necesitamos un select del tipo SELECT ... WHERE columna_1 = X AND columna_2 = Y y ya tenemos un INDEX con la columna_1, podemos crear un segundo indice con la columna 2, o mejor todava, crear un nico indice combinado con las columnas 1 y 2. Estos son los ndices multicolumna, o compuestos. No obstante si tienes indices multicolumna y los utilizas en las clausulas WHERE, debes incluir siempre de izquierda a derecha las columnas indexadas; o el indice NO se usar: Supongamos un INDEX usuario (id, name, adress), y una clusula SELECT ... WHERE NAME = x. Este Select no aprovechar el ndice. Tampoco lo hara un SELECT ... WHERE ID =X AND ADRESS = Y. Cualquier consulta que incluya una columna parte del index sin incluir adems las columnas a su izquierda, no usar el indice. Por tanto en nuestro ejemplo solo sacarian provecho del indice las consultas SELECT ... WHERE ID = x, o WHERE ID = X AND NAME = y o WHERE ID = x AND NAME = y AND ADRESS = Z Cuando un ndice contiene mas de una columna, cada columna es leida por el orden que ocupa de izquierda a derecha, y a efectos prcticos, cada columna (por ese orden) es como si constituyera su propio ndice. Esto significa que en el ejemplo anterior, no hara falta crear otro INDEX ID (id) ya que podramos usar nuestro INDEX USUARIO simplemente con la clusula SELECT ... WHERE ID = X;
Puedes ver si tu llamada sql usa o no los ndices correctos anteponiendo a select la orden explain: EXPLAIN SELECT * FROM mitable WHERE .... Y para ser sinceros, usando explain para comprobar el uso de indices en distintos selects con indices multicolumna, he obtenido resultados poco consistentes con la 'regla de la izquierda' ya que en muchos casos parece que se usaban indices que tericamente no debian estar disponibles ... posiblemente un caso de mala configuracion en mi tabla-test

Tipos de indice
En algunas bases de datos existen diferencias entre KEY e INDEX. No as en MySQL donde son sinnimos. Un ndice que s es especial es el llamado PRIMARY KEY. Se trata de un ndice diseado para consultas especialmente

rpidas. Todos sus campos deben ser UNICOS y no admite NULL Un indice UNIQUE es aquel que no permite almacenar dos valores iguales. Los indices FULL TEXT permiten realizar bsquedas de palabras. Puedes crear indices FULLTEXT sobre columnas tipo CHAR, VARCHAR o TEXT. Una vez creado puedes hacer bsquedas del tipo: SELECT * FROM nombre_tabla WHERE MATCH(nombre_indice_fulltext) AGAINST('palabra_a_buscar'); Algunas limitaciones de los indices fulltext: solo busca por palabras completas. indice no encontrar indices. No se indexan las palabras de menos de cuatro letras. No se indexan columnas que contengan menos de tres filas, ni palabras que aparezcan en la mitad o mas de las filas. Las palabras separadas por guiones se cuentan como dos palabras. Los indices ordinarios no tienen restricciones en cuanto a la existencia de valores idnticos o nulos. Una posibilidad interesante, si pensamos crear un ndice sobre columnas CHAR y VARCHAR es la de limitar el campo a indexar. Por ejemplo, cada entrada en la columna puede ser de hasta 40 caracteres y nosotros indexar unicamente los primeros 10 de cada una. Para crear estos ndices basta con indicar entre parntesis el numero de caracteres a indexar despues del nombre de la columna: ALTER TABLE libros ADD INDEX idx_autor(nombre(10), apellidos(10));

Desventajas de los indices


Los ndices se actualizan cada vez que se modifica la columna o columnas que utiliza. Por ello no es aconsejable usar como indices columnas en las que sern frecuentes operaciones de escritura (INSERT, UPDATE, DELETE). Tampoco tendra sentido crear indices sobre columnas cuando cualquier select sobre ellos va a devolver una gran cantidad de resultados; por ejemplo una columna booleana que admita los valores Y/N. En fin, tampoco es necesario usar indices en tablas demasiado pequeas, ya que en estos casos no hay ganancia de rapidez frente a una consulta normal. Finalmente, los ndices ocupan espacio. A veces, incluso mas que la tabla de datos.

Das könnte Ihnen auch gefallen