Performance - script
From Ibbddunq
Contents |
Indices
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 relaciÃ�³n entre el contenido y el nÃ�ºmero 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 tambi�©n a�±adirlos a una tabla despu�©s de creada:
ALTER TABLE nombre_tabla ADD INDEX nombre_indice (columna_indexada);
Los Ã�Ândices permiten mayor rÃ�¡pidez en la ejecuciÃ�³n de las consultas a la base de datos tipo SELECT ... WHERE
La regla bÃ�¡sica es crear Ã�Ândices sobre aquellas columnas que se usen en una clÃ�¡usula WHERE. Pero existen varias reglas donde el uso de un Ã�Ândice podrÃ�Âa afectar directamente a la performance de una consulta (Group BY, Order BY)
Otra regla b�¡sica 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 id�©nticos, como por ejemplo sexo (masculino y femenino) porque cada consulta implicar�¡ siempre recorrer practicamente la mitad del indice.
Diferentes tipos de indices
En algunas bases de datos existen diferencias entre KEY e INDEX ( no as� en MySQL donde son sin�³nimos)
- Un Ã�Ândice que sÃ� es especial es el llamado PRIMARY KEY. Se trata de un Ã�Ândice diseÃ�±ado para consultas especialmente rÃ�¡pidas. 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 b�ºsquedas de palabras sobre tablas MYSAM. Puedes crear indices FULLTEXT sobre columnas tipo CHAR, VARCHAR o TEXT. Una vez creado puedes hacer b�ºsquedas del tipo:
SELECT * FROM nombre_tabla WHERE MATCH(nombre_indice_fulltext) AGAINST('palabra_a_buscar');
Los Ã�Ândices ordinarios no tienen restricciones en cuanto a la existencia de valores idÃ�©nticos 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 parÃ�©ntesis el numero de caracteres a indexar despues del nombre de la columna:
ALTER TABLE libros ADD INDEX idx_autor(nombre(10), apellidos(10));
Tips de indices
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 todavÃ�Âa, crear un Ã�ºnico indice combinado con las columnas 1 y 2. Estos son los Ã�Ândices multicolumna, o compuestos.
No obstante si tienes Ã�Ândices multicolumna y los utilizas en las clausulas WHERE, incluir siempre de izquierda a derecha las columnas indexadas; o el indice NO se usarÃ�¡:
BibliografÃ�Âa =
http://dev.mysql.com/doc/refman/6.0/en/mysql-indexes.html http://dev.mysql.com/doc/refman/6.0/en/group-by-optimization.html http://dev.mysql.com/doc/refman/6.0/en/order-by-optimization.html