Você está na página 1de 4

1.4.

Creacin de ndices

INDICE:

Un ndice es una estructura interna que el sistema puede usar para encontrar 1 o ms registros en
una tabla de forma rpida, un ndice de Base de Datos se crea para una columna o grupo de
columnas, un ndice de Base de Datos se crea para una columna o grupo de columnas. A un ndice
se le asigna un nombre de acuerdo con las mismas reglas que se aplican para los nombres de
tablas.

Los ndices son "estructuras" alternativa a la organizacin de los datos en una tabla. El propsito
de los ndices es acelerar el acceso a los datos mediante operaciones fsicas ms rpidas y
efectivas. Para entender mejor la importancia de un ndice pongamos un ejemplo; imagnate que
tienes delante las pginas amarillas, y deseas buscar el telfono de Manuel Salazar que vive en
Alicante. Lo que hars ser buscar en ese pesado libro la poblacin Alicante, y guindote por la
cabecera de las pginas buscars los apellidos que empiezan por S de Salazar. De esa forma
localizars ms rpido el apellido Salazar. Pues bien, enhorabuena, has estado usando un ndice.
Pues el objetivo de definir ndices en SQL Server es exactamente para conseguir el mismo
objetivo: acceder ms rpido a los datos. Adems SQL Server tiene dos tipos de ndices que
analizaremos a continuacin.

Por qu usar ndices?

Mayor velocidad para localizar datos

Reforzar la identificacin nica

Arquitectura de los ndices

Es un conjunto de pginas distribuidas en un rbol B.

Cada pgina mide 8kb = 8192 bytes, con un encabezado de 96b, dejando 8096b para
datos.

SQL Server acceso al Disco Duro por pagina

En la Tabla Sys indexes se encuentra un puntero a la pgina raz.

Sin taxis
Create ndex nom_indice
On nom_tabla (columnas(s))

Ejemplo
Create ndex idxclave
On clientes (Clave)[1]
Ms informacion acerca de:

Creacin de ndices
Si se utiliza el motor de datos Jet de Microsoft slo se pueden crear ndices en bases de datos del
mismo motor. La sintaxis para crear un ndice en ua tabla ya definida en la siguiente:
CREATE [ UNIQUE ] INDEX ndice
ON Tabla (campo [ASC|DESC][, campo [ASC|DESC], ...])
[WITH { PRIMARY | DISALLOW NULL | IGNORE NULL }]

En donde:
ndice Es el nombre del ndice a crear.
tabla Es el nombre de una tabla existente en la que se crear el ndice.
campo Es el nombre del campo o lista de campos que constituyen el ndice.
Indica el orden de los valores de los campos ASC indica un orden ascendente (valor
ASC|DESC
predeterminado) y DESC un orden descendente.
UNIQUE Indica que el ndice no puede contener valores duplicados.
DISALLOW
Prohbe valores nulos en el ndice
NULL
IGNORE
Excluye del ndice los valores nulos incluidos en los campos que lo componen.
NULL
Asigna al ndice la categora de clave principal, en cada tabla slo puede existir un
PRIMARY nico ndice que sea "Clave Principal". Si un ndice es clave principal implica que no
puede contener valores nulos ni duplicados.
En el caso de ACCESS, se puede utilizar CREATE INDEX para crear un pesado ndice sobre una
tabla adjunta en una fuente de datos ODBC tal como SQL Server que no tenga todava un ndice.
No necesita permiso o tener acceso a un servidor remoto para crear un pesado ndice, adems la
base de datos remota no es consciente y no es afectada por el pesado ndice. Se utiliza la misma
sintaxis para las tablas adjuntas que para las originales. Esto es especialmente til para crear un
ndice en una tabla que sera de slo lectura debido a la falta de un ndice.

ndices no-agrupados

Los ndices no agrupados tienen la misma estructura de rbol b que los ndices
agrupados, con algunos matices; como hemos visto antes, en los ndices
agrupados, en el ltimo nivel del ndice (nivel de hoja) estn los datos; en los
ndices no-agrupados, en el nivel de hoja del ndice, hay un puntero a la
localizacin fsica de la fila correspondiente en el ndice agrupado. Adems, la
ordenacin de las filas del ndice est construida en base a la(s) columna(s)
indexadas, lo cual no quiere decir (a diferencia de los ndices agrupados), que la
organizacin fsica de las pginas de datos corresponda con el ndice.

Consideraciones para usar ndices agrupados

Columnas con datos muy selectivos

Consultas que no devuelven muchas filas.

Columnas en WHERE.
Evitar acceso a pginas de datos realizando el acceso slo por el ndice.

Converged quieres (consultas cubiertas).

En SQL Server 2005, son nuevos los ndices INCLUDE que son ndices no-
agrupados que en el nivel de hoja del ndice (donde est el puntero al ndice
agrupado), se puede incluir ms columnas; el objetivo de este nuevo tipo de
ndices es beneficiar el uso de las consultar cubiertas para evitar que se acceda a
la pgina de datos del ndice agrupado.

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_indicepara


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 ndice

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 ndice UNIQUE es aquel que no permite almacenar dos valores iguales.

Los ndices FULL TEXT permiten realizar bsquedas de palabras. Puedes crear ndices 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 ndices fulltext: solo busca por palabras completas. ndice no
encontrar ndices. 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 ms de las filas. Las
palabras separadas por guiones se cuentan como dos palabras.
Los ndices 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 nicamente los primeros 10 de cada una. Para crear estos ndices
basta con indicar entre parntesis el nmero de caracteres a indexar despus del nombre de la
columna:
ALTER TABLE libros ADD INDEX idx_autor(nombre(10), apellidos(10));

Desventajas de los ndices Los ndices se actualizan cada vez que se modifica la columna o
columnas que utiliza. Por ello no es aconsejable usar como ndices columnas en las que sern
frecuentes operaciones de escritura (INSERT, UPDATE, DELETE).

Tampoco tendra sentido crear ndices 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 ndices 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 ms que la tabla de datos.

Você também pode gostar