Performance - script
From Ibbddunq
Line 1: | Line 1: | ||
= Indices = | = 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 | + | 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 | + | 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 | + | 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...) | INDEX nombre_indice (columna_indexada, columna_indexada2...) | ||
- | La sintaxis es ligeramente distinta segun la clase de | + | La sintaxis es ligeramente distinta segun la clase de índice: |
PRIMARY KEY (nombre_columna_1 [,nombre_columna2...]) | PRIMARY KEY (nombre_columna_1 [,nombre_columna2...]) | ||
Line 14: | Line 14: | ||
INDEX nombre_index (columna_indexada1 [,columna_indexada2...]) | INDEX nombre_index (columna_indexada1 [,columna_indexada2...]) | ||
- | Podemos | + | Podemos también añadirlos a una tabla despuÃ�©s de creada: |
ALTER TABLE nombre_tabla ADD INDEX nombre_indice (columna_indexada); | ALTER TABLE nombre_tabla ADD INDEX nombre_indice (columna_indexada); |
Revision as of 13:18, 8 June 2009
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