Índice ( índice en inglés ): un objeto de base de datos creado para mejorar el rendimiento de la recuperación de datos . Las tablas en una base de datos pueden tener una gran cantidad de filas que se almacenan en un orden arbitrario, y buscarlas según un criterio determinado escaneando secuencialmente la tabla fila por fila puede llevar mucho tiempo. El índice se forma a partir de los valores de una o más columnas de la tabla y apunta a las filas correspondientes de la tabla y, por lo tanto, le permite buscar filas que cumplan con los criterios de búsqueda. La aceleración del trabajo mediante el uso de índices se logra principalmente debido al hecho de que el índice tiene una estructura optimizada para la búsqueda, por ejemplo, un árbol equilibrado .
Algunos DBMS amplían las capacidades de los índices al introducir la posibilidad de crear índices en columnas de vista [1] o índices en expresiones. [2] Por ejemplo, una expresión puede crear un índice upper(last_name)y, en consecuencia, almacenará referencias, cuya clave será el valor del campo last_nameen mayúsculas. Además, los índices se pueden declarar como únicos o no únicos. Un índice único implementa una restricción de integridad en una tabla, eliminando la posibilidad de insertar valores duplicados.
Hay dos tipos de índices: agrupados y no agrupados. Si hay un índice agrupado, las filas de la tabla se ordenan por el valor de la clave del índice. Si la tabla no tiene un índice agrupado, la tabla se denomina montón [3] . Un índice no agrupado creado en una tabla de este tipo solo contiene punteros a los registros de la tabla. Solo puede haber un índice agrupado por tabla, pero cada tabla puede tener varios índices no agrupados diferentes, cada uno de los cuales define su propio orden de registro.
Los índices pueden ser implementados por varias estructuras. Los más utilizados son los árboles B* , los árboles B+ , los árboles B y los hashes .
El orden en que aparecen las columnas en un índice compuesto es muy importante. El punto es que es posible obtener un conjunto de datos para una consulta que afecta solo a la primera de las columnas indexadas. Sin embargo, en la mayoría de los DBMS es imposible o ineficiente obtener datos solo en la segunda columna indexada y en las posteriores (sin restricciones en la primera columna)
Por ejemplo, imagine una guía telefónica ordenada primero por ciudad, luego por apellido y luego por nombre. Si conoce la ciudad, puede encontrar fácilmente todos los números de teléfono de esa ciudad. Sin embargo, en dicho directorio llevará mucho tiempo encontrar todos los teléfonos registrados para un determinado apellido; para esto, debe buscar en la sección de cada ciudad y buscar allí el apellido deseado. Algunos DBMS hacen este trabajo, otros simplemente no usan dicho índice.
Para un rendimiento óptimo de las consultas, los índices se crean normalmente en las columnas de la tabla que se usan con frecuencia en las consultas. Se pueden crear múltiples índices en la misma tabla. Sin embargo, aumentar la cantidad de índices ralentiza las operaciones de agregar, actualizar y eliminar filas de la tabla, ya que los índices mismos deben actualizarse. Además, los índices ocupan memoria adicional, por lo que antes de crear un índice, debe asegurarse de que la ganancia de rendimiento esperada para las consultas supere la sobrecarga adicional de los recursos de su computadora para mantener el índice.
Los índices son útiles para muchas aplicaciones, pero existen limitaciones para su uso. Tome esta consulta SQL :
SELECT first_name FROM people WHERE last_name = 'Frankenstein' ;Para ejecutar una consulta de este tipo sin índice, el DBMS debe examinar un campo last_nameen cada fila de la tabla (este mecanismo se conoce como "fuerza bruta" o "exploración completa de la tabla", y puede mostrarse como NATURAL en el plan). Cuando se usa un índice, el DBMS simplemente recorre el árbol B hasta que encuentra la entrada "Frankenstein". Tal pase requiere muchos menos recursos que una búsqueda completa de la tabla.
Ahora vamos a tomar esta consulta:
SELECCIONE email_address DESDE clientes DONDE email_address COMO '%@yahoo.com' ;Esta consulta debe encontrar a todos los clientes cuyo correo electrónico termine con @yahoo.com; sin embargo, incluso si email_addresshay un índice en la columna, el DBMS seguirá utilizando una búsqueda completa de la tabla. Esto se debe a que los índices se basan en la suposición de que las palabras/caracteres van de izquierda a derecha. El uso de un carácter comodín al comienzo de una condición de búsqueda evita que el DBMS utilice una búsqueda de árbol B. En muchos DBMS, este problema se puede resolver creando un índice adicional por expresión reverse(email_address)y formando una consulta como:
SELECCIONE la dirección de correo electrónico DESDE los clientes DONDE inversa ( dirección de correo electrónico ) COMO inversa ( ' %@yahoo.com ' );En este caso, el comodín aparecerá en la posición más a la derecha ( moc.oohay@%), lo que no impide el uso de un índice en reverse(email_address).
En términos generales, un índice en bases de datos es un archivo con una secuencia de pares de claves y punteros. [4] La idea de usar índices surgió del hecho de que las bases de datos modernas son demasiado grandes para caber en la memoria principal. Por lo general, dividimos los datos en bloques y los asignamos en la memoria bloque por bloque. Sin embargo, la búsqueda de un registro en la base de datos puede llevar mucho tiempo. Por otro lado, un archivo de índice o bloque de índice es mucho más pequeño que un bloque de datos y puede caber en un búfer de memoria principal, lo que acelera la búsqueda de registros.
Un índice disperso se caracteriza por el hecho de que cada clave está asociada con un puntero de bloque específico en el archivo de datos ordenados.
Un índice denso , a su vez, se diferencia en que cada clave está asociada con un puntero específico a un registro en un archivo de datos ordenados .
En los índices agrupados con claves duplicadas, el índice disperso apunta a la clave más pequeña de cada bloque, mientras que el índice denso apunta a la primera entrada con la clave especificada.
Base de datos | |
---|---|
Conceptos | |
Objetos |
|
Llaves | |
sql |
|
Componentes |