Performance - script
From Ibbddunq
m (BibliografÃ�Âa =) |
|||
Line 1: | Line 1: | ||
= Indices = | = Indices = | ||
- | Un | + | 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); | ||
- | Los | + | Los Ã�Ândices permiten mayor rÃ�¡pidez en la ejecuciÃ�³n de las consultas a la base de datos tipo SELECT ... WHERE |
- | La regla | + | 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 | + | 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 == | == Diferentes tipos de indices == | ||
- | En algunas bases de datos existen diferencias entre KEY e INDEX ( no | + | En algunas bases de datos existen diferencias entre KEY e INDEX ( no as� en MySQL donde son sin�³nimos) |
- | * Un | + | * 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. | * Un indice UNIQUE es aquel que no permite almacenar dos valores iguales. | ||
- | * Los indices FULL TEXT permiten realizar | + | * 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'); | SELECT * FROM nombre_tabla WHERE MATCH(nombre_indice_fulltext) AGAINST('palabra_a_buscar'); | ||
- | Los | + | 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)); | ALTER TABLE libros ADD INDEX idx_autor(nombre(10), apellidos(10)); | ||
Line 43: | Line 43: | ||
== Tips de indices == | == 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 | + | 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 | + | 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 == | = 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 |
Revision as of 13:15, 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