sql >> Base de Datos >  >> RDS >> Mysql

Una introducción a los índices SQL

En los sistemas de bases de datos relacionales, un índice de base de datos es una herramienta extremadamente poderosa para la recuperación de datos. En esta guía, aprenderá sobre índices únicos, claves primarias y claves primarias compuestas.

¿Qué es un índice de base de datos?

Un índice de base de datos es un objeto de estructura de datos asociado con una tabla de base de datos. Se utiliza para aumentar la velocidad de las consultas de la base de datos (a través de SQL SELECT dominio). En general, existen métodos bien definidos para decidir los tipos de índices que se van a crear. Esto se rige en gran medida por cómo las tablas de una base de datos se relacionan entre sí y cómo se recuperan los datos.

¿Por qué usar índices?

En general, las consultas (o búsquedas) en una tabla a través de SQL SELECT Los comandos son secuenciales. La búsqueda secuencial requiere comenzar en la parte superior de la tabla y leer cada fila de datos hasta que se recuperen los datos deseados. Esto es extremadamente ineficiente y puede ser una operación costosa en términos de velocidad.

Los índices, por otro lado, utilizan una función hash para calcular un valor de índice. Proporciona acceso directo a la fila afectada (clave) en el índice. Una vez que esa fila (clave) se encuentra en el índice, el registro del índice tiene un puntero directamente a la fila de la tabla que se requiere en la consulta. Estos punteros se establecen durante la creación y el mantenimiento del índice. La velocidad de recuperación de datos cuando se usan índices aumenta en órdenes de magnitud.

La anatomía de un índice de base de datos único

Una tabla de base de datos puede tener uno o más índices asociados. Los propios índices contienen valores de fila (clave) de una o más columnas de una tabla. También tiene un puntero que apunta a las filas reales de la tabla que contienen estos valores clave. El número de filas a las que apunta una clave dada en un índice depende de si el índice es un índice único o un índice no único .

Como su nombre lo indica, un índice único contiene claves que apuntan a una sola fila de datos en una tabla determinada. Los índices únicos garantizan que cada fila de la tabla contenga valores únicos en las columnas de tabla indexadas definidas. Efectivamente, dos filas no pueden tener valores idénticos en las columnas indexadas. Además, se crean índices únicos en columnas designadas como clave principal para la mesa Las claves primarias se definen como una o más columnas que definen de forma única una fila en una tabla de base de datos.

Los ejemplos a continuación demuestran cómo se usan las claves primarias y los índices únicos en SQL. Todos los ejemplos usan una tabla llamada Student , en una base de datos de ejemplo llamada exampledb . Para agregar los datos de ejemplo, use el siguiente comando:

INSERT INTO Student(SSNumber, LastName, FirstName)
  VALUES
(111111111, Smith, John),
(222222222, Jones, Mary),
(333333333, Hansen, Robert);

Ver los datos almacenados en el Student tabla:

SELECT * FROM Student;

Debería ver el siguiente resultado:

+-----------+----------+-----------+
| SSNumber  | LastName | FirstName |
+-----------+----------+-----------+
| 111111111 | Smith    | John      |
| 222222222 | Jones    | Mary      |
| 333333333 | Hansen   | Robert    |
+-----------+----------+-----------+
Nota A menos que se indique lo contrario, todos los comandos de esta guía funcionan bien tanto en MySQL y PostgreSQL bases de datos.

Clave principal e índice de columna única

Como ejemplo, suponga que una escuela realiza un seguimiento de sus estudiantes en una tabla llamada Student . Esta tabla tiene columnas asociadas llamadas Student , SSNumber , LastName y FirstName . De estas columnas, Student es la columna de clave principal, ya que identifica de forma única cada fila de datos en el Student mesa. Cree un índice único (SSIndex ) en el SSNumber columna, para facilitar la recuperación rápida de datos de la tabla. El siguiente comando SQL DDL se usa para realizar esta consulta:

CREATE TABLE Student (SSNumber CHAR(9) NOT NULL,LastName VARCHAR(30) NOT NULL,FirstName VARCHAR(20) NOT NULL,PRIMARY KEY (SSNumber));

CREATE UNIQUE INDEX SSIndex ON Student (SSNumber);
Nota Los dos comandos SQL anteriores están delimitados por un punto y coma (;), que es compatible con la mayoría de los sistemas de bases de datos relacionales. SSNumber se designa específicamente como la clave principal de la tabla.

SSIndex solo contiene información que identifica de forma única los datos en cada fila del Student mesa. Cada fila de SSIndex tiene un puntero a su fila correspondiente en el Student mesa. Este SSIndex index le permite evitar una búsqueda secuencial de datos en la tabla que mejora el rendimiento al minimizar el tiempo necesario para la consulta.

Para encontrar la información asociada a Robert Hansen a través de su SSNumber , use el comando SQL incluido a continuación. El comando no solo elimina la búsqueda secuencial de Student pero también usa el SSIndex para proporcionar acceso directo a la fila de datos requerida. Esto se debe al uso de una función hash y un puntero de índice asociado.

SELECT * FROM Student WHERE SSNumber = 333333333;

Los datos devueltos deben ser los siguientes:

+-----------+----------+-----------+
| SSNumber  | LastName | FirstName |
+-----------+----------+-----------+
| 333333333 | Hansen   | Robert    |
+-----------+----------+-----------+

Índice y clave primaria compuesta de varias columnas

Los ejemplos de esta sección utilizan tres tablas que almacenan datos relacionados con una liga de tenis. Las tres mesas se denominan Player , League y Membership . Un jugador puede jugar en varias ligas, y la tabla de miembros proporciona esa asociación. Las tres tablas tienen las siguientes columnas asociadas:

Las columnas del Player tabla se muestran a continuación con PlayedID como clave principal.

+----------+-----------+-----------+
| PlayedID | LastName  | FirstName |
+----------+-----------+-----------+

Las columnas de la League tabla se muestran a continuación con LeagueId como clave principal.

+----------+------------+------------+
| LeagueId | LeagueName | SkillLevel |
+----------+------------+------------+

Las columnas de la Membership tabla se muestran a continuación

+----------+-----------+
| PlayedID | LeagueId  |
+----------+-----------+

Los pasos a continuación le muestran cómo crear el Player , League y Membership mesas.

  1. Desde el Player tabla, el PlayedID columna identifica de forma única cada fila de datos. Crear el Player tabla seguida de un índice único en el PlayerId columna.

     CREATE TABLE Player (
       PlayedID INT NOT NULL,
       LastName VARCHAR(30) NOT NULL,
       FirstName VARCHAR(20) NOT NULL,
       PRIMARY KEY (PlayedID)
     );
    
     CREATE UNIQUE INDEX PlayerIndex ON Player (PlayedID);
    
  2. De la League tabla, el LeagueId columna identifica de forma única cada fila de datos. Crear la League seguida de un índice único en el LeagueId columna. El siguiente es el comando SQL para realizar esta operación:

     CREATE TABLE League (
       LeagueId INT NOT NULL,
       LeagueName VARCHAR(50) NOT NULL,
       SkilLevel VARCHAR(20) NOT NULL,
       PRIMARY KEY (LeagueId)
     );
    
     CREATE UNIQUE INDEX LeagueIndex ON League (LeagueId);
    
  3. Desde la Membership tabla, tanto el PlayedID y LeagueId las columnas identifican de forma única cada fila de datos; que es la clave primaria compuesta. Crear la Membership tabla seguida de un índice compuesto único en el PlayedID y LeagueId columnas.

     CREATE TABLE Membership (
       PlayerId INT NOT NULL,
       LeagueId INT NOT NULL,
       PRIMARY KEY(PlayerId, LeagueId)
     );
    
     CREATE UNIQUE INDEX MembershipIndex ON Membership (PlayerId, LeagueId);
    

El MembershipIndex es un índice generado por hash que consta de la clave compuesta (PlayedId y LeagueId ). Tiene punteros a las filas de datos que representa. El uso de dicho índice facilita la recuperación de datos de acceso directo y rápido, a diferencia de la recuperación de datos secuencial lineal. Por ejemplo, para determinar todos los jugadores asociados con "Dobles masculinos" de varios registros en cada una de las tablas anteriores, puede emitir el siguiente comando SQL:

SELECT Player.LastName, Player.Firstname
FROM Player, Membership
WHERE Membership.LeagueId = 2
AND Membership.PlayerId = Player.PlayerId

Se devuelven los siguientes datos:

+----------+-----------+
| LastName | FirstName |
+----------+-----------+
| Smith    | John      |
| Hansen   | Robert    |
+-----------+----------+

Sin el uso de MembershipIndex y PlayerIndex , la consulta anterior se ejecutaría mucho más lento.

Índices no únicos

Un índice no único contiene entradas que pueden apuntar a una o más filas para cualquier valor clave dado. Por ejemplo, para buscar por el nombre de una persona, es necesario crear un índice compuesto no único en una tabla tanto para FirstName y LastName . Dado que la combinación de FirstName y LastName no se puede garantizar que sea único, el índice resultante creado en esas dos columnas genera efectivamente un índice no único.

Problema de degradación del rendimiento de la base de datos al usar índices

Si bien los índices contribuyen a la velocidad de ejecución de las consultas, deben actualizarse siempre que cambien las columnas indexadas o cuando se agreguen o eliminen filas de la tabla de la base de datos. Esto puede ser perjudicial para el rendimiento de la base de datos. Es importante tener en cuenta la cantidad de inserción, eliminación y modificación requerida de sus índices durante el uso de la base de datos transaccional. Considere lo que es importante para usted en la aplicación de la base de datos; la velocidad de ejecución de consultas o la velocidad de manipulación de datos. La respuesta a esa pregunta radica en cómo se usa la aplicación de la base de datos, con qué frecuencia afecta el diseño de la base de datos y la cantidad de índices creados.

Conclusión

La creación y el uso de índices de bases de datos genera respuestas de recuperación de consultas rápidas y elimina las búsquedas de filas secuenciales de las tablas. Sin embargo, el mantenimiento de índices a través de la manipulación de datos puede tener un impacto negativo en el rendimiento de una base de datos. Los diseñadores de bases de datos deben ser conscientes de las ventajas y desventajas que implica el uso de índices de bases de datos y tener en cuenta la optimización para el rendimiento general de la base de datos.