# Acceso indexado

Acceso indexado o acceso indizado (la traducción correcta) es un modo de organización de archivos en el cual al archivo le acompaña un índice que tiene la función de permitir el acceso directo a los registros del disco. El índice se puede organizar de diversas formas, las más típicas son: secuencial, multinivel y árbol. A través del índice podremos procesar un archivo de forma secuencial o de forma directa según la clave de indización, y esto independientemente de cómo esté organizado el archivo por sí mismo.

## Procesamiento de archivos

Es la forma de solicitar la información al disco. Existen dos métodos para ello:
* Modo Secuencial: Se lee la información de un archivo de registro en registro teniendo que leer todos los que hay antes del que buscamos. Se emplea bien por deseo, bien por imposición del tipo de soporte que estamos usando. El acceso secuencial es recomendable cuando se quiere trabajar con muchos registros del archivo.
* Modo Directo: Se puede acceder a un registro si tener que leer todos los anteriores (basta con un pequeño número de lecturas). Hay dos maneras:
** Cálculo: Cada región tiene una clave sobre la que se aplica un cálculo que indica el lugar de grabación (Hashing).
** índices: existe un índice independiente o asociado al archivo en el cual se busca el registro y se indica donde está.

## Organización de archivos

Son los modos de disponer los registros del archivo en el soporte. Existen tres modos principales:
* Secuencial: Un registro a continuación de otro.
* Directo: Los registros binarios no se disponen en el soporte atendiendo a un algoritmo de cálculo.
* Indizado: Los registros generalmente se almacenan acceso secuencialmente y van con un índice .
Los registros se organizan en una secuencia basada en un campo clave presentando dos características, un índice del archivo para soportar los accesos aleatorios y un archivo de desbordamiento. El índice proporciona una capacidad de búsqueda para llegar rápidamente al registro deseado y el archivo de desbordamiento es similar al archivo de registros usado en un archivo acceso secuencial, pero está integrado de forma que los archivos de desbordamiento se ubiquen siguiendo un puntero desde su registro predecesor.
La estructura más simple tiene como índice un archivo acceso secuencial simple, cada registro del archivo índice tiene dos campos, un campo clave igual al del archivo principal y un puntero al archivo principal. Para encontrar un campo específico se busca en el índice hasta encontrar el valor mayor de la clave que es igual o precede al valor deseado de la clave, la búsqueda continua en el archivo principal a partir de la posición que indique el puntero.
Cada registro del archivo principal tiene un campo adicional que es un puntero al archivo de desbordamiento. Cuando se inserta un nuevo registro al archivo, también se añade al archivo de desbordamiento. El registro del archivo principal que precede inmediatamente al nuevo registro según la secuencia lógica se actualiza con un puntero del registro nuevo en el archivo de desbordamiento, si el registro inmediatamente anterior está también en el archivo de desbordamiento se actualizará el puntero en el registro.
Para procesar secuencialmente un archivo completo los registros del archivo principal se procesarán en secuencia hasta encontrar un puntero al archivo de desbordamiento, el acceso continúa en el archivo de desbordamiento hasta que encuentra un puntero nulo, entonces renueva el acceso donde se abandonó en el archivo principal.

## Ventajas y desventajas

Ventajas:
* Permite el acceso secuencial.
* Permite el acceso directo a los registros.
* Se pueden actualizar los registros en el mismo archivo, sin necesidad de crear un archivo nuevo de copia en el proceso de actualización.
Desventajas:
* Ocupa más espacio en el disco que los archivos secuenciales, debido al uso del área de índices.
* Tiene tendencia a que aumente el tiempo medio de acceso a los registros, cuando se producen muchas altas nuevas con claves que hay que intercalar entre las existentes, ya que aumenta el área de overflow.
* Solo se puede utilizar soportes direccionables.
* Obliga a una inversión económica mayor, por la necesidad de programas y, a veces, hardware más sofisticado.

## Problemas

* Desafortunadamente el archivo de secuencial es difícil de mantener.
* Los índices (aún usando un esquema de B+ Tree) nos permiten hacer búsquedas rápidamente pero se debe hacer demasiados "seeks" para poder hacerlo.
En la práctica en muchas situaciones se requieren de ambas cosas (búsquedas y accesos secuenciales).
Las 2 soluciones existentes:
* ISAM indexed sequential access method
* B+ Tree

## Método de acceso secuencial indizado (ISAM)

Básicamente es la idea de tener un índice esparcido, de manera que el archivo de datos lo agrupamos por bloques y en cada bloque existe un "rango" ordenado de los datos.
Lo importante a resaltar aquí es que los bloques no necesariamente están formando una secuencia en el archivo, es decir, dentro del archivo de datos los bloques pueden estar desordenados, aquí el detalle es mantener un puntero a cada bloque subsecuente.

## Estructura lógica de un archivo acceso secuencial indizado

En este tipo de organización de archivos se dispone de una tabla en la que aparecen ordenados secuencialmente los números de la clave del archivo y asociados a cada uno de ellos de da la dirección del registro correspondiente. Cada registro en el archivo se identifica por medio de un número o un grupo de caracteres exclusivos (llave primaria).
Los registros se almacena según una secuencia física dada, este ordenamiento más usualmente es de disponerlos en el orden indicado por la llave, con lo cual permite un procesamiento secuencial de los registros precisamente en el orden en que estás distribuidos en el archivo y también es posible el procesamiento aleatorio,, en el que se lega a los registros en un orden cualquiera.

## Métodos de acceso y sistemas de almacenamiento por Sistema Operativo
### Windows

Los sistemas de organización de archivos que utiliza Windows utilizan el acceso secuencial y acceso indizado adjuntos en un mismo método), el acceso directo en algunos casos en la utilización de los sistemas de organización por tablas.

### Linux

Linux es el sistema operativo que soporta más sistemas de organización lo cual lo convierte en uno de los más versátiles; además al igual que Windows utiliza los mismos tipos de acceso y sistemas de organización. La estructura de archivos es unas estructura jerárquica en forma de árbol invertido, donde el directorio principal (raíz) es el directorio "/", del que cuelga toda la estructura del sistema. Este sistema de archivos permite al usuario crear, borrar y acceder a los archivos sin necesidad de saber el lugar exacto en el que se encuentran. No existen unidades físicas, sino archivos que hacen referencia a ellas. Consta de tres partes importantes, superbloque, tabla de i-nodos y bloques de datos.

## Ejemplo acceso secuencial indizado

Suponemos que queremos acceder a la ubicación del número 27 en una lista que va del 1 al 40 (como en la imagen de abajo).
1.-Seccionamos el archivo (formamos rangos): Del 1-8, del 9-16, del 17-24, del 25-32 y del 33-40
2.-Vamos a tomar los primeros valores de cada rango que definimos: 1, 9, 17, 25, 33 y con ellos vamos a formar una nueva lista, mucho más pequeña
3.-Vamos a recorrer esta sub lista para encontrar el representante de la sección a la que queremos acceder.
4.- Primera posición, el 1 ¿Es mayor que 27?, no. Entonces pasamos a la siguiente posición.
5.-Segunda posición de la sub lista, el 9 ¿Mayor que 27?, no. Pasamos a la siguiente.
6.-Tercera posición, el 17 ¿Es mayor que 27?, no. Pasamos a la siguiente posición.
7.-Cuarta posición, el 25 ¿Es mayor que 27?, no. Pasamos a la que sigue.
8.-Quinta posición, el 33¿Es mayor que 27?, si. Por lo tanto, como el 33 es la primera posición del quinto bloque, el 27 va a estar en el bloque anterior, en el bloque que empieza con el 25.
9.-Tomamos el índice del número 25 y nos vamos al arreglo principal a la posición que nos dice el índice .
10.-Comenzamos a buscar hacia adelante, acceso secuencialmente, hasta encontrar el 27.
Es más rápido buscar el número de esta forma, que irse buscando acceso secuencialmente toda la lista que tenemos al inicio, hasta encontrar el valor que queremos.