Un índice de base de datos es una estructura de datos que mejora la velocidad de las operaciones de recuperación de datos en una tabla de base de datos, a costa de escrituras adicionales y espacio de almacenamiento para mantener la estructura de datos del índice. [ 1 ] Los índices se utilizan para localizar datos rápidamente sin tener que buscar en cada fila de una tabla de base de datos cada vez que se accede a ella. Los índices se pueden crear utilizando una o más columnas de una tabla de base de datos , proporcionando la base tanto para búsquedas aleatorias rápidas como para un acceso eficiente a registros ordenados.
Un índice es una copia de columnas de datos seleccionadas de una tabla, diseñada para permitir búsquedas muy eficientes. Normalmente, un índice incluye una clave o enlace directo a la fila original de la que se copió, lo que permite recuperar la fila completa de forma eficiente. Algunas bases de datos amplían la potencia de la indexación permitiendo a los desarrolladores crear índices sobre valores de columna transformados mediante funciones o expresiones . Por ejemplo, se podría crear un índice sobre upper(last_name), que almacenaría únicamente las versiones en mayúsculas del last_namecampo en el índice. Otra opción que a veces se admite es el uso de índices parciales , donde las entradas del índice se crean solo para aquellos registros que satisfacen alguna expresión condicional. Un aspecto adicional de flexibilidad es permitir la indexación sobre funciones definidas por el usuario , así como sobre expresiones formadas a partir de diversas funciones integradas.
Uso
Soporte para búsqueda rápida
La mayoría del software de bases de datos incluye tecnología de indexación que permite búsquedas en tiempo sublineal para mejorar el rendimiento, ya que la búsqueda lineal es ineficiente para bases de datos grandes.
Supongamos que una base de datos contiene N elementos y que se debe recuperar uno de ellos en función del valor de uno de sus campos. Una implementación sencilla recupera y examina cada elemento según la prueba. Si solo hay un elemento coincidente, el proceso se detiene al encontrarlo; pero si hay varios, debe probarlos todos. Esto significa que el número de operaciones, en promedio, es O (N) o tiempo lineal . Dado que las bases de datos pueden contener muchos objetos y que la búsqueda es una operación común, suele ser deseable mejorar el rendimiento.
Un índice es cualquier estructura de datos que mejora el rendimiento de las búsquedas. Existen diversas estructuras de datos utilizadas para este fin. El diseño implica complejas compensaciones en cuanto al rendimiento de las búsquedas, el tamaño del índice y el rendimiento de su actualización. Muchos diseños de índices presentan un rendimiento de búsqueda logarítmico ( O (log(N))) y, en algunas aplicaciones, es posible alcanzar un rendimiento plano ( O (1)).
Controlar las restricciones de la base de datos
Los índices se utilizan para controlar las restricciones de la base de datos , como UNIQUE, EXCLUSION, PRIMARY KEY y FOREIGN KEY . Un índice puede declararse como UNIQUE, lo que crea una restricción implícita en la tabla subyacente. Los sistemas de bases de datos suelen crear implícitamente un índice en un conjunto de columnas declaradas como PRIMARY KEY, y algunos pueden utilizar un índice ya existente para controlar esta restricción. Muchos sistemas de bases de datos requieren que tanto las columnas que hacen referencia como las que son referenciadas en una restricción FOREIGN KEY estén indexadas, lo que mejora el rendimiento de las inserciones, actualizaciones y eliminaciones en las tablas que participan en la restricción.
Algunos sistemas de bases de datos admiten una restricción de EXCLUSIÓN que garantiza que, para un registro recién insertado o actualizado, un predicado determinado no se cumpla para ningún otro registro. Esto se puede usar para implementar una restricción UNIQUE (con predicado de igualdad) o restricciones más complejas, como garantizar que no se almacenen en la tabla rangos de tiempo superpuestos ni objetos geométricos que se intersequen. Se requiere un índice que permita una búsqueda rápida de los registros que satisfacen el predicado para controlar dicha restricción. [ 2 ]
Arquitectura de índices y métodos de indexación
No agrupado
Los datos se presentan en un orden arbitrario, pero el orden lógico lo especifica el índice. Las filas de datos pueden estar distribuidas por toda la tabla, independientemente del valor de la columna o expresión indexada. El árbol de índice no agrupado contiene las claves de índice ordenadas, y el nivel hoja del índice contiene el puntero al registro (página y número de fila en la página de datos en motores organizados por página; desplazamiento de fila en motores organizados por archivo).
En un índice no agrupado,
- El orden físico de las filas no coincide con el orden del índice.
- Las columnas indexadas suelen ser columnas que no son clave primaria y que se utilizan en las cláusulas JOIN, WHERE y ORDER BY.
Una tabla de base de datos puede tener más de un índice no agrupado.
Agrupados
La agrupación modifica el bloque de datos para que coincida con el índice, lo que permite almacenar los datos de las filas en orden. Por lo tanto, solo se puede crear un índice agrupado en una tabla de base de datos. Los índices agrupados pueden aumentar considerablemente la velocidad de recuperación, pero generalmente solo cuando se accede a los datos de forma secuencial, en el mismo orden o en orden inverso al del índice agrupado, o cuando se selecciona un rango de elementos.
Dado que los registros físicos se encuentran ordenados de esta manera en el disco, la siguiente fila de la secuencia se ubica inmediatamente antes o después de la última, lo que reduce la cantidad de lecturas de bloques de datos. Por lo tanto, la característica principal de un índice agrupado es la ordenación de las filas de datos físicas según los bloques de índice que las referencian. Algunas bases de datos separan los bloques de datos y de índice en archivos distintos, mientras que otras colocan dos bloques de datos completamente diferentes dentro del mismo archivo o archivos físicos.
Grupo
Cuando se combinan varias bases de datos y varias tablas, se denomina clúster (que no debe confundirse con el índice agrupado descrito anteriormente). Los registros de las tablas que comparten el valor de una clave de clúster se almacenarán juntos en el mismo bloque de datos o en bloques de datos cercanos. Esto puede mejorar las combinaciones de estas tablas en la clave de clúster, ya que los registros coincidentes se almacenan juntos y se requiere menos E/S para localizarlos. [ 3 ] La configuración del clúster define la disposición de los datos en las tablas que forman parte del clúster. Un clúster puede estar indexado mediante un índice B-tree o una tabla hash . El bloque de datos donde se almacena el registro de la tabla se define mediante el valor de la clave de clúster.
Orden de las columnas
El orden en que la definición del índice especifica las columnas es importante. Es posible recuperar un conjunto de identificadores de fila utilizando únicamente la primera columna indexada. Sin embargo, no es posible ni eficiente (en la mayoría de las bases de datos) recuperar dicho conjunto utilizando solo la segunda columna indexada o las siguientes.
Por ejemplo, en una guía telefónica organizada primero por ciudad, luego por apellido y finalmente por nombre, en una ciudad específica se puede extraer fácilmente la lista de todos los números de teléfono. Sin embargo, sería muy tedioso encontrar todos los números de teléfono de un apellido en particular. Habría que buscar dentro de la sección de cada ciudad las entradas con ese apellido. Algunas bases de datos permiten realizar esta búsqueda, otras simplemente no utilizan el índice.
En el ejemplo de la guía telefónica con un índice compuesto creado en las columnas ( city, last_name, first_name), si buscamos proporcionando valores exactos para los tres campos, el tiempo de búsqueda es mínimo; pero si proporcionamos los valores para cityy first_namesolo, la búsqueda utiliza únicamente el citycampo para recuperar todos los registros coincidentes. Luego, una búsqueda secuencial verifica la coincidencia con first_name. Por lo tanto, para mejorar el rendimiento, es necesario asegurarse de que el índice se cree en el orden de las columnas de búsqueda.
Aplicaciones y limitaciones
Los índices son útiles para muchas aplicaciones, pero presentan algunas limitaciones. Consideremos la siguiente instrucción SQL : . Para procesar esta instrucción sin un índice, el software de la base de datos debe examinar la columna last_name en cada fila de la tabla (esto se conoce como un escaneo completo de la tabla ). Con un índice, la base de datos simplemente sigue la estructura de datos del índice (normalmente un árbol B ) hasta encontrar la entrada de Smith; esto es mucho menos costoso computacionalmente que un escaneo completo de la tabla.SELECTfirst_nameFROMpeopleWHERElast_name='Smith';
Considere esta instrucción SQL: . Esta consulta devolvería una dirección de correo electrónico para cada cliente cuya dirección de correo electrónico termine en "@wikipedia.org", pero incluso si la columna email_address se ha indexado, la base de datos debe realizar un escaneo completo del índice. Esto se debe a que el índice se construye bajo el supuesto de que las palabras van de izquierda a derecha. Con un comodín al principio del término de búsqueda, el software de la base de datos no puede utilizar la estructura de datos del índice subyacente (en otras palabras, la cláusula WHERE no es indexable ). Este problema se puede resolver mediante la adición de otro índice creado en y una consulta SQL como esta: . Esto coloca el comodín en la parte más a la derecha de la consulta (ahoraSELECTemail_addressFROMcustomersWHEREemail_addressLIKE'%@wikipedia.org';reverse(email_address)SELECTemail_addressFROMcustomersWHEREreverse(email_address)LIKEreverse('%@wikipedia.org');gro.aidepikiw@%), que el índice en reverse(email_address) puede satisfacer.
Cuando se utilizan caracteres comodín a ambos lados de la palabra de búsqueda como %wikipedia.org% , no se utiliza el índice disponible en este campo. En su lugar, solo se realiza una búsqueda secuencial, que toma tiempo .
Para mitigar esto, se puede utilizar un enfoque de indexación de texto completo. Por ejemplo, el texto se puede dividir en trigramas (fragmentos de 3 caracteres) y almacenarse en un GIN ( índice invertido generalizado ) para reducir la complejidad de la búsqueda a aproximadamentetiempo
Tipos de índices
Índice de mapa de bits
Un índice de mapa de bits es un tipo especial de indexación que almacena la mayor parte de sus datos como matrices de bits (mapas de bits) y responde a la mayoría de las consultas realizando operaciones lógicas bit a bit sobre estos mapas de bits. Los índices más utilizados, como los árboles B+ , son más eficientes si los valores que indexan no se repiten o se repiten pocas veces. En cambio, el índice de mapa de bits está diseñado para casos en los que los valores de una variable se repiten con mucha frecuencia. Por ejemplo, el campo "sexo" en una base de datos de clientes suele contener como máximo tres valores distintos: masculino, femenino o desconocido (no registrado). Para este tipo de variables, el índice de mapa de bits puede ofrecer una ventaja de rendimiento significativa sobre los árboles comúnmente utilizados.
Índice denso
Un índice denso en bases de datos es un archivo con pares de claves y punteros para cada registro del archivo de datos. Cada clave en este archivo está asociada con un puntero específico a un registro en el archivo de datos ordenado. En índices agrupados con claves duplicadas, el índice denso apunta al primer registro con esa clave. [ 4 ]
Índice disperso
En las bases de datos, un índice disperso es un archivo con pares de claves y punteros para cada bloque del archivo de datos. Cada clave de este archivo está asociada a un puntero específico que apunta al bloque correspondiente en el archivo de datos ordenado. En los índices agrupados con claves duplicadas, el índice disperso apunta a la clave de búsqueda más baja de cada bloque.
Índice inverso
Un índice de clave inversa invierte el valor de la clave antes de insertarlo en el índice. Por ejemplo, el valor 24538 se convierte en 83542 en el índice. Invertir el valor de la clave es especialmente útil para indexar datos como números de secuencia, donde los nuevos valores de clave aumentan monótonamente.
Índice invertido
Un índice invertido asocia una palabra clave con el documento que la contiene, lo que permite realizar búsquedas de texto completo.
Índice primario
El índice primario contiene los campos clave de la tabla y un puntero a los campos no clave. Este índice se crea automáticamente al crear la tabla en la base de datos.
Índice secundario
Se utiliza para indexar campos que no son ni campos de ordenación ni campos clave (no hay garantía de que el archivo esté organizado por campos clave o clave primaria). Cada tupla del archivo de datos contiene una entrada de índice (índice denso) con el valor del atributo indexado y un puntero al bloque o registro.
Índice hash
Hashing lineal
Otro tipo de índice utilizado en los sistemas de bases de datos es el hash lineal .
Implementaciones de índices
Los índices se pueden implementar utilizando diversas estructuras de datos. Entre los índices más populares se incluyen los árboles balanceados , los árboles B+ y las funciones hash . [ 5 ]
En Microsoft SQL Server , el nodo hoja del índice agrupado corresponde a los datos reales, no simplemente a un puntero a datos que residen en otro lugar, como ocurre con un índice no agrupado. [ 6 ] Cada relación puede tener un único índice agrupado y muchos índices no agrupados. [ 7 ]
Control de concurrencia de índices
Un índice suele ser accedido simultáneamente por varias transacciones y procesos, por lo que requiere control de concurrencia . Si bien, en principio, los índices pueden utilizar los métodos comunes de control de concurrencia de bases de datos, existen métodos especializados que se aplican junto con los comunes para lograr una mejora sustancial del rendimiento.
Índice de cobertura
En la mayoría de los casos, un índice se utiliza para localizar rápidamente los registros de datos de los que se leen los datos necesarios. En otras palabras, el índice solo se utiliza para localizar registros de datos en la tabla y no para devolver datos.
Un índice de cobertura es un caso especial en el que el propio índice contiene los campos de datos necesarios y puede proporcionar los datos requeridos.
Considere la siguiente tabla (se omiten otros campos):
Para encontrar el nombre del ID 13, un índice en (ID) resulta útil, pero aun así es necesario leer el registro para obtener el nombre. Sin embargo, un índice en (ID, Nombre) contiene el campo de datos requerido y elimina la necesidad de consultar el registro.
Los índices de cobertura se aplican a tablas específicas. Las consultas que realizan JOIN/accesos a través de varias tablas pueden considerar la posibilidad de utilizar índices de cobertura en más de una de ellas. [ 8 ]
Un índice de cobertura puede acelerar drásticamente la recuperación de datos, pero puede resultar grande debido a las claves adicionales, que ralentizan la inserción y actualización de datos. Para reducir el tamaño de dicho índice, algunos sistemas permiten incluir campos que no son clave. Estos campos no forman parte del ordenamiento del índice, sino que se incluyen únicamente en el nivel hoja, lo que permite crear un índice de cobertura con un tamaño total menor.
Esto se puede hacer en SQL con . [ 9 ] [ 10 ]CREATEINDEXmy_indexONmy_table(id)INCLUDE(name);
Normalización
No existe un estándar que defina cómo crear índices, ya que el estándar ISO SQL no abarca los aspectos físicos. Los índices son uno de los componentes físicos de la concepción de bases de datos, junto con otros como el almacenamiento (espacios de tablas o grupos de archivos). Los proveedores de sistemas de gestión de bases de datos relacionales (RDBMS) ofrecen una sintaxis con opciones específicas que dependen de las capacidades de su software.CREATEINDEX
Véase también
- Bloqueo de índice
- Índice invertido : tipo de índice de base de datos
- Indexación de motores de búsqueda : método para la gestión de datos.
Referencias
- ↑ Mitchell, Sarah (3 de diciembre de 2025). "¿Cómo aceleran las consultas los índices de bases de datos?" . Terabyte Systems . Recuperado el 4 de diciembre de 2025 .
- ↑ "CREATE TABLE" . Documentación de PostgreSQL . 27 de octubre de 2016.
- ↑ Descripción general de los clústeres Conceptos de Oracle® Database 10g Release 1 (10.1)
- ↑ Sistemas de bases de datos: El libro completo. Hector Garcia-Molina , Jeffrey D. Ullman , Jennifer D. Widom
- ↑ Gavin Powell (2006). Capítulo 8: Creación de modelos de bases de datos de alto rendimiento . Wrox Publishing . ISBN 978-0-7645-7490-0Archivado del original el 18 de agosto de 2007. Consultado el 29 de abril de 2007 .
{{cite book}}:|work=ignorado ( ayuda ) - ↑ "Estructuras de índices agrupados" . Libros en línea de SQL Server 2005 (septiembre de 2007) . 4 de octubre de 2012.
- ↑ Daren Bieniek; Randy Dess; Mike Hotek; Javier Loria; Adam Machanic; Antonio Soto; Adolfo Wiernik (enero de 2006). "Capítulo 4: Creación de índices" . Implementación y administración de SQL Server 2005. Microsoft Press.
- ↑ "Índices de cobertura para la optimización de consultas | Literate Java" . 13 de junio de 2016.
- ↑ "11.9. Escaneos solo de índices e índices de cobertura" . Documentación de PostgreSQL . 9 de febrero de 2023. Consultado el 8 de abril de 2023 .
- ↑ MikeRayMSFT. "Crear índices con columnas incluidas - SQL Server" . learn.microsoft.com . Consultado el 8 de abril de 2023 .
- Bases de datos
- Técnicas de indexación de bases de datos
- Sistemas de gestión de bases de datos