Sei sulla pagina 1di 7

Qu son los ndices en bases de

datos
Imagina que tiene toda la informacin telefnica de los habitantes de un pas
como Venezuela, de una poblacin aproximada de 30 millones de habitantes.
Suponga tambin que los datos no estn ordenados.
Nota: Para que los ndices se noten realmente, debemos contar con un nmero significativo de
registros en una tabla. Pero no es necesario que sean millones. Creando una buena estrategia de
ndices podemos mejorar sensiblemente la velocidad de las consultas en tablas con varios miles de
registros. Claro est que la mejora suele ser proporcional y depende mucho de esa cantidad de
registros. Tambin un uso inadecuado de ellos puede redundar en prdida de rendimiento, por lo
que conviene saber qu es lo que estamos haciendo.

Veamos una consulta como esta:

SELECT * FROM personas WHERE apellido="zamora"

Sin ningn orden en nuestros datos, MySQL debe leer todos los registros de la tabla
"personas" y efectuar una comparacin entre el campo "apellido" y la cadena de
caracteres "zamora" para encontrar alguna coincidencia (en la vida real habr muchas
coincidencias). A medida que esta base de datos sufra modificaciones, como un
incremento en el numero de registros, dicha consulta ir requiriendo un mayor el
esfuerzo de la CPU y el uso de memoria necesaria para ejecutarse.
Si tuviramos una gua telefnica a mano localizaramos fcilmente a cualquiera con
apellido "zamora" yendo al final de la gua, a la letra "Z". El mtodo en s est dado en
funcin a como estn ordenados los datos y en el conocimiento de los mismos. En otras
palabras, localizamos rpidamente a "zamora" porque est ordenado por apellido y
porque conocemos el abecedario.
Si abrimos un libro tcnico observamos que posee un ndice al final del libro, contenido
por trminos o conceptos importantes con su correspondiente numero de pgina. Si
sabemos de qu trata el libro buscamos la palabra que nos interesa y encontramos la
expresin junto con su nmero de pgina.

Los ndices de base de datos son muy similares. Al igual que el escritor decide crear un
ndice de trminos y conceptos importantes de su libro, como administradores de una
base de datos decidimos crear un ndice respecto a una columna.
Nota: A lo largo de la documentacin variada que encontrars sobre MySQL en Internet en general,
se utilizan trminos como INDICE o CLAVE para referirse a lo mismo. Por tanto, decir por ejemplo
"apellido es una clave de la tabla personas" es igual a decir que el "campo apellido de la tabla
personas est indexado".

Creando ndices en MySQL


Usando el ejemplo inicial, para que la consulta anterior se ejecutase ms
rpido en nuestro sistema gestor de base de datos, nos vendra bien crear un
ndice por apellido. Para crear ese ndice podemos utilizar una sentencia en
lenguaje SQL como la siguiente:
ALTER TABLE personas ADD INDEX (apellido)

De esta forma sencilla indicamos a MySQL que genere una lista ordenada de
todos los apellidos de la tabla personas, as como en el ejemplo del libro
tenemos los nmeros de telfono ordenados por el apellido.
Nota: Te animamos a usar los comandos de MySQL directamente para experimentar con stas u
otras consultas en lenguaje SQL. Si lo prefieres, puedes usar algunas aplicaciones para administrar
una base de datos, ya sean en entorno web como PhpMyAdmin o en aplicaciones de escritorio
como Heidi SQL.

Viendo los ndices desde la


perspectiva del servidor de base de
datos
Los ndices se almacenan de forma que la base de datos (o motor) pueda
eliminar registros o filas determinadas del resultado de una consulta

ejecutada, son dinmicos y su gestin es transparente para el usuario o


desarrollador.
Tenemos que saber que, sin ninguna Indexacin, MySQL (as como cualquier otro gestor
de base de datos) lee cada registro, consumiendo tiempo, utilizando muchas operaciones
de ENTRADA/SALIDA en el disco e incluso llegando a corromper el sistema de cach del
servidor.
Un aspecto muy importante es que no es recomendable crear un ndice por cada
columna de una tabla! MySQL necesita tener una lista separada de los valores de ndice y
actualizarlos conforme van cambiando. Al final, el manejo de ndices requiere un
equilibrio adecuado entre espacio de almacenamiento y tiempo.
Una tabla con un campo indexado de MySQL usa ms espacio y un BIT extra (por lo
menos hasta la versin 5) para las consultas.
Para experimentar puedes usar una tabla disponible en el siguiente link
Dicha tabla posee ms de 300.000 nombres de personas (sin telfonos) y no se encuentra
indexada.
Puedes subirla con los siguientes pasos desde PhpMyAdmin: selecciona la base de datos
-> Importar -> Archivo a importar:
Selecciona el archivo descargado -> Continuar

Debes seleccionar la base de datos luego la opcin SQL

Entonces podrs ejecutar consultas de prueba sobre esa tabla y luego crear el ndice con
la misma opcin usando:

ALTER TABLE personas ADD INDEX (apellido)

Una vez creado el ndice, puedes volver ejecutar las mismas consultas y comparar los
tiempos de respuesta.
En algunos entornos bien optimizados en MySQL, no sern tan significativas las
diferencias de tiempo, porque las consultas ya estarn cacheadas no dejando apreciar la
diferencia. En el momento de escribir este artculo, en un servidor de pruebas (no es una
estadstica ni una prueba de performance profesional) observ un cambio significativo de

casi 100 milisegundos entre una consulta de esta tabla no indexada y otra consulta
despus de haber aplicado un ndice.
Nota: Adems, por mi experiencia, algunas veces me ha tocado optimizar una pgina web creada
por otras personas y recuerdo especialmente un caso en el que la pgina tardaba en cargar de
manera extraordinariamente extraa. Existan pginas cuya carga ralentizaba el sitio hasta en 20 o
30 segundos ms que otras pginas, lo que era demasiado. Despus de hacer un anlisis
benchmark desde PHP nos dimos cuenta de que ciertas consultas a MySQL eran las que estaban
perjudicando el proceso de carga y se solucion simplemente creando unos ndices en las tablas en
aquellos campos que se mencionaban en la parte del "Where" del SQL. A menudo, los
desarrolladores no nos damos cuenta de que la optimizacin de las consultas es uno de los puntos
ms importantes para la rapidez de carga de un sitio.

En prximos artculos detallaremos los diferentes tipos de ndices, as como los diferentes
tipos de tablas que ofrece este popular motor de base de datos MySQL que te ayudarn a
incrementar el funcionamiento ptimo de tus sistemas o servidores web con MySQL sin
tener que aumentar los costos de hardware.

4.4.1 Tipos de indices


Los ndices sirven para acceder a los registros de una tabla rpidamente, acelerando la
localizacin de la informacin.
Los ndices se emplean para facilitar la obtencin de informacin de una tabla. El indice de
una tabla desempea la misma funcin que el ndice de un libro: permite encontrar datos
rpidamente; en el caso de las tablas, localiza registros.
Oracle accede a los datos de dos maneras:

1.

Recorriendo las tablas; comenzando el principio y extrayendo los registros que


cumplen las condiciones de la consulta; lo cual implica posicionar las cabezas

lectoras, leer el dato, controlar si coincide con lo que se busca (como si


pasramos una a una las pginas de un libro buscando un tema especfico).
2.

Empleando ndices; recorriendo la estructura de rbol del ndice para localizar


los registros y extrayendo los que cumplen las condiciones de la consulta
(comparando con un libro, diremos que es como leer el ndice y luego de
encontrar el tema buscado, ir directamente a la pgina indicada).

Un ndice posibilita el acceso directo y rpido haciendo ms eficiente las bsquedas. Sin
ndice, Oracle debe recorrer secuencialmente toda la tabla para encontrar un registro.
Los ndices son estructuras asociadas a tablas, una tabla que almacena los campos
indexados y se crean para acelerar las consultas.
Entonces, el objetivo de un indice es acelerar la recuperacin de informacin. La indexacin es
una tcnica que optimiza el acceso a los datos, mejora el rendimiento acelerando las
consultas y otras operaciones. Es til cuando la tabla contiene miles de registros, cuando se
realizan operaciones de ordenamiento y agrupamiento y cuando se combinan varias tablas
(tema que veremos ms adelante).
La desventaja es que consume espacio en el disco en disco y genera costo de mantenimiento
(tiempo y recursos).
Es importante identificar el o los campos por los que sera til crear un ndice, aquellos
campos por los cuales se realizan bsquedas con frecuencia: claves primarias, claves
externas o campos que combinan tablas.
No se recomienda crear ndices sobre campos que no se usan con frecuencia en consultas o
en tablas muy pequeas.
Los cambios sobre la tabla, como insercin, actualizacin o eliminacin de registros, son
incorporados automticamente.
Cuando creamos una restriccin "primary key" o "unique" a una tabla, Oracle automticamente
crea un ndice sobre el campo (o los campos) de la restriccin y le da el mismo nombre que la
restriccin. En caso que la tabla ya tenga un ndice, Oracle lo usa, no crea otro.
Oracle permite crear distintos tipos de ndices. "Normal" es el standard de Oracle, son ndices
tipo rbol binario; contiene una entrada por cada valor de clave que almacena la direccin

donde se encuentra el dato. Es el tipo predeterminado y el ms comn (el nico que


estudiaremos

Potrebbero piacerti anche