6. Indexamiento

6.1 Definición de índice (index)

Tomemos como analogía el índice de los libros.

"Es una tabla que contiene una lista de elementos (llaves)  y números de referencia donde dichos elementos se encuentran (campos de referencia)".

Qué nos permite un índice ??

a) Imponer un orden en un archivo sin tener que reordenarlo
 

Archivo Indice en memoria (index file)
                      Key                          Posición
Bell
k
Harris
3
Itaca
1
   
Kellog
2

Archivo
     Posición                         Registro
1
Itaca | 56 | Chicago
2
Kellog | 77 | New York
3
Harris | 99 | California
   
k
Bell |  32 | Denver

 

b) Proveer múltiples caminos de acceso a un archivo
 

Archivo Indice en memoria (index file)
           Key                          Posición
California
3
Chicago
1
Denver
k
   
New York
2

Archivo
   Posición                         Registro
1
Itaca | 56 | Chicago
2
Kellog | 77 | New York
3
Harris | 99 | California
   
k
Bell |  32 | Denver

 

 


Indices para búsquedas, no se requiere acceso secuencial a los datos
(Non indexed sequential access)

6.2 Simple index

Recordemos que el objetivo inicial para usar índices era poder hacer búsquedas binarias en los archivos de manera que encontráramos más rápidamente los registros deseados

Dichas búsquedas se realizan en base a la "llave primaria" o "primary key" que identifica de manera única a nuestro registo. Dicha llave puede estar compuesta por varios campos, como se muestra en el ejemplo siguiente.
 

Archivo Indice en memoria (index file)
 
Key (Label+ID) Posición
ANG3795 152
COL31809 338
COL38358 196
DG139201  382
DG18807 241
FF245 427
LON2312 17
MER75016 285
RCA2626 62
WAR23699 117

Archivo
 
Posición Registro (Label, ID, Title, Composer)
17 LON|2312|Romeo nd Juliet | Prokofiev
62 RCA| 2626| Quartet in C Sharp Minor | Beethoven
117 WAR| 23699 | Touchstone | Corea
 152  ANG | 3795 | Symphony No. 9 | Beethoven
196 COL | 38358 | Nebraska | Springsteen
241 DG | 18807 | Symphony No. 9 | Beethoven
285 MER | 75016 | Coq d'Or Suite | Rimsky-Korsakov
338 COL | 31809 | Symphony No. 9 | Dvorak
382 DG | 139201 | Vilin Concerto | Beethoven
427 FF | 245 | Good News | Sweet Honey in the Rock

 

 


6.3 Operaciones para el mantenimiento de un archivo indexado.

-Asumiendo que todo el índice cabe en memoria

Crear los archivos

Cargar el índice en memoria

Reescribir el archivo índice (index file) de memoria

Agregar Registros

Eliminar Registros

Actualizar Registros
Existen 2 posibilidades



6.4 Indices en relación con su tamaño

6.4.1 Indices Densos e Indices Esparcidos

Cuando hablamos de índices podemos hacer una división de acuerdo al número de elementos que posee en relación con el archivo de datos
De manera que tenermos 2 categorías:
Indices densos: aquellos que poseen un número de elementos igual al de registros en el archivo de datos
Indices esparcidos: aquellos que son más reducidos que su respectivo archivo de datos

Ventajas:
Indice denso: poder encontrar cualquier registro rápidamente o bien determinar su inexistencia, además de poder accesar a la infomación en O(1) .
Indice esparcido: su tamaño hace que pueda ser mantenido en memoria ram sin ningún problema

Desventajas:
Indice denso: su gran tamaño; aunque en realidad no es tan significante y de ahi que sean los más utilizados
Indice esparcido: por lo general, forzosamente tiene que accesar al archivo original para determinar la existencia de algun registro, o bien hacer algunos accesos secuenciales para recuperarlo.



Archivo Indice denso
                      Key                          Posición
10
1
20
2
30
3
40 4
50

k

Archivo
     Posición                         Registro
1
10 | Itaca | Chicago
2
20 | Kellog | New York
3
30 |Harris |  California
4
  40 |  Williams | Portland
k
50 | Bell |  Denver

 

Archivo Indice esparcido
                      Key                          Posición
10
1
30
3
50
k
70 l
90

m

Archivo
     Posición                         Registro
1
10 | Itaca |  Chicago
2
20 | Kellog |  New York
3
30 | Harris | California
4  40 |  Williams | Portland
k
50 | Bell |  32 | Denver

 

 



6.4.2 Indices que son demasiado grandes para procesarse en memoria


Lo que se ha mencionado hasta el momento, y desafortunadamente muchas de las ventajas que presenta es que estamos asumiendo que el índice tiene un cierto tamaño que puede ser almacenado y procesado en memoria RAM. En caso de que suceda lo contrario lo que se debe hacer es procesar directamente el índice en disco (almacenamiento secundario) lo cual presenta ciertas desventajas:
 


Soluciones:


Importante:
El hecho de que existan estas desventajas no quiere decir que no se use este método, en realidad presenta ventajas:



 

6.5 Múltiples Llaves

6.5.1  Indexado para acceso por Múltiples llaves

En el ejemplo 6.2 indexamos los registros por su Label y su ID, pero en la práctica únicamente nos interesaría búsquedas por estas llaves ??

No, es lógico pensar en búsquedas por otros campos, por ejemplo todos los registros cuyo autor sea "Beethoven" o bien todas las canciones cuyo título sea "Symphony No. 9", de modo que pudieramos obtener alguna referencia (primary key) hacia todos los registros que cumplan con nuestro criterio de búsqueda.

De manera que lo primero que se nos viene a la mente es crear otros "índices" basados en estos campos que son de interés, a estos campos se les conoce como "llaves secundarias" o "secondary keys".

Una diferencia de estos índices de llaves secundarias es que debemos obtener primero la llave primaria  para entonces poder recuperar la posición (ubicación) de dicho registro, a esto se le conoce como "entry sequenced" .
Pensemos en un registro de una licencia de manejo, llegamos a hacer nuestro examen y nos piden nuestro nombre, nos buscan y obtienen el número de licencia y gracias a éste se pueden recuperar todos los demás datos y aplicar el examen correspondiente.
 
 

Secondary Index  (composer)        Primary Key
BEETHOVEN ANG3795
BEETHOVEN DG139201
BEETHOVEN DG18807
BEETHOVEN RCA2626
COREA WAR23699
DVORAK COL31809
PROKOFIEV LON2312
RIMSKY-KORSAKOV MER75016
SPRINGSTEEN COL38358
SWEET HONEY IN T  FF245
             Secondary Index (title)          Primary key
COD D'OR SUITE MER75016
GOOD NEWS FF245
NEBRASKA COL38358
QUARTET IN SHARP RCA2626
ROMEO AND JULIET LON2312
SYMPHONY NO. 9 ANG3795
SYMPHONY NO. 9 COL31809
SYMPHONY NO. 9 DG18807
TOUSHSTONE WAR23699
VIOLIN CONCERTO DG139201

Es claro notar que a simple vista resultaría mejor tener directamente la posición del registro en lugar del primary key, pero analizando las operaciones relacionadas con dichos archivos descubriremos el motivo.

Agregación de Registros


Eliminación de Registros


Actualización de Registros



6.5.2 Recuperación usando combinaciones de llaves secundarias

Por lo general lo que se necesita es "restringir" o "delimitar" las búsquedas, de manera que utilizamos varios criterios para definir lo que estamos buscando.
Esto no es nada nuevo, lo hemos usado en buscadores tradicionales "udla and biblioteca", solo que aquí estamos definiendo qué buscar en qué llave secundaria:
"universidad=udla and departamento=biblioteca".

Para el ejemplo que estamos presentando sería algo como:

Encuentra todos los datos de los registros con:
composer='BEETHOVEN' and title='SYMPHONY NO. 9'   .

Buscando en el índice secundario por "composer" obtenemos:
 

ANG3795
DG139201
DG18807
RCA2626

Y del índice secundario por "title":
 

ANG3795
COL31809
DG18807

de manera que :
 
 

Composer
ANG3795
DG139201
DG18807
RCA2626
Title
ANG3795
COL31809
DG18807
Match 
ANG3795
DG18807

Buscando el Match en el índice primario:

ANG3795 nos da la posición :  152
            ANG | 3795 | Symphony No. 9 | Beethoven

DG18807 nos da la posición: 241
            DG | 18807 | Symphony No. 9 | Beethoven



6.6 Archivos Invertidos (Listas Invertidas)

Los índices secundarios que hemos manejado hasta el momento presentan algunas dificultades:
 


Alguna solución que ha surgido

Colocar un arreglo de índices dentro del mismo registro
 
 

BEETHOVEN ANG3795  DG139201  DG18807  RCA2626
COREA WAR23699
DVORAK COL31809
PROKOFIEV LON2312
RIMSKY-KORSAKOV MER75016
SPRINGSTEEN COL38558
SWEET HONEY IN T FF245

Las ventajas de este esquema, o lo que se espera de él:


El  planteamiento anterior suena muy bien, pero....como se implementaría ??
El problema:
No podemos tener un registro infinito que nos permita almacenar N número de referencias.

Nuevamente las estructuras de datos van a solucionar este problema.
Utilizaremos algo que se conoce como "listas invertidas" o "archivos invertidos", las cuales son listas ligadas que nos permiten agregar o eliminar referencias.
El término de "invertida" únicamente se refiere al procedimiento que tenemos que seguir porque primero buscamos en el índice secundario y posteriormente la primaria.
 
 

BEETHOVEN               --->
COREA                          --->
DVORAK                      --->
PROKOFIEV                 --->
--->
ANG3795
DG139201
DG18807
RCA2626
--->
WAR23699
--->
COL31809
--->
LON2312
XXX99999

Ya implementado sería:
 
 

                                 Secondary Index file
BEETHOVEN 3
COREA 2
DVORAK 7
PROKOFIEV 10
RIMSKY-KORSAKOV 6
SPRINGSTEEN 4
SWEET HONE IN TH 9

                                   Label ID List file
0 LON2312 -1
1 RCA2626 -1
2 WAR23699 -1
3 ANG3795 8
4 COL38358 -1
5 DG18807 1
6 MER75016 -1
7 COL31809 -1
8 DG139201 5
9 FF245 -1
10 ANG36193 0

Los archivos invertidos tienen algunas ventajas: