Resumen :en este tutorial, aprenderá a usar índices de SQLite para consultar datos más rápido, acelerar la operación de clasificación y aplicar restricciones únicas.
¿Qué es un índice?
En las bases de datos relacionales, una tabla es una lista de filas. Al mismo tiempo, cada fila tiene la misma estructura de columna que consta de celdas. Cada fila también tiene un número de secuencia de ID de fila consecutivo que se usa para identificar la fila. Por lo tanto, puede considerar una tabla como una lista de pares:(rowid, fila).
A diferencia de una tabla, un índice tiene una relación opuesta:(row, rowid). Un índice es una estructura de datos adicional que ayuda a mejorar el rendimiento de una consulta.
SQLite usa B-tree para organizar índices. Tenga en cuenta que B significa equilibrado, B-tree es un árbol equilibrado, no un árbol binario.
El árbol B mantiene equilibrada la cantidad de datos en ambos lados del árbol, de modo que el número de niveles que deben atravesarse para ubicar una fila sea siempre el mismo número aproximado. Además, las consultas con igualdad (=) y rangos (>,>=, <,<=) en los índices del árbol B son muy eficientes.
Cómo funciona un índice
Cada índice debe estar asociado a una tabla específica. Un índice consta de una o más columnas, pero todas las columnas de un índice deben estar en la misma tabla. Una tabla puede tener varios índices.
Cada vez que crea un índice, SQLite crea una estructura de árbol B para contener los datos del índice.
El índice contiene datos de las columnas que especificas en el índice y el correspondiente rowid
valor. Esto ayuda a SQLite a ubicar rápidamente la fila en función de los valores de las columnas indexadas.
Imagine un índice en la base de datos como el índice de un libro. Al mirar el índice, puede identificar rápidamente los números de página en función de las palabras clave.
SQLite CREATE INDEX
declaración
Para crear un índice, utiliza el CREATE INDEX
declaración con la siguiente sintaxis:
CREATE [UNIQUE] INDEX index_name
ON table_name(column_list);
Code language: SQL (Structured Query Language) (sql)
Para crear un índice, especifica tres información importante:
- El nombre del índice después de
CREATE INDEX
palabras clave. - El nombre de la tabla a la que pertenece el índice.
- Una lista de columnas del índice.
En caso de que desee asegurarse de que los valores en una o más columnas sean únicos, como el correo electrónico y el teléfono, use el UNIQUE
opción en CREATE INDEX
declaración. El CREATE UNIQUE INDEX
crea un nuevo índice único.
SQLite UNIQUE
ejemplo de índice
Vamos a crear una nueva tabla llamada contacts
para demostración.
CREATE TABLE contacts (
first_name text NOT NULL,
last_name text NOT NULL,
email text NOT NULL
);
Code language: SQL (Structured Query Language) (sql)
Pruébalo
Supongamos que desea hacer cumplir que el correo electrónico es único, crea un índice único de la siguiente manera:
CREATE UNIQUE INDEX idx_contacts_email
ON contacts (email);
Code language: SQL (Structured Query Language) (sql)
Pruébalo
Para probar esto.
Primero, inserte una fila en los contacts
mesa.
INSERT INTO contacts (first_name, last_name, email)
VALUES('John','Doe','[email protected]');
Code language: SQL (Structured Query Language) (sql)
Pruébalo
En segundo lugar, inserte otra fila con un correo electrónico duplicado.
INSERT INTO contacts (first_name, last_name, email)
VALUES('Johny','Doe','[email protected]');
Code language: SQL (Structured Query Language) (sql)
Pruébalo
SQLite emitió un mensaje de error que indica que se ha violado el índice único. Porque cuando insertó la segunda fila, SQLite verificó y se aseguró de que el correo electrónico sea único en todas las filas en email
de los contacts
mesa.
Insertemos dos filas más en los contacts
mesa.
INSERT INTO contacts (first_name, last_name, email)
VALUES('David','Brown','[email protected]'),
('Lisa','Smith','[email protected]');
Code language: SQL (Structured Query Language) (sql)
Pruébalo
Si consulta datos de los contacts
tabla basada en un correo electrónico específico, SQLite usará el índice para ubicar los datos. Ver la siguiente declaración:
SELECT
first_name,
last_name,
email
FROM
contacts
WHERE
email = '[email protected]';
Code language: SQL (Structured Query Language) (sql)
Pruébalo
Para verificar si SQLite usa el índice o no, usa el EXPLAIN QUERY PLAN
declaración de la siguiente manera:
EXPLAIN QUERY PLAN
SELECT
first_name,
last_name,
email
FROM
contacts
WHERE
email = '[email protected]';
Code language: SQL (Structured Query Language) (sql)
Pruébalo
Ejemplo de índice de varias columnas de SQLite
Si crea un índice que consta de una columna, SQLite usa esa columna como clave de ordenación. En caso de que cree un índice que tenga varias columnas, SQLite usa las columnas adicionales como la segunda, tercera,... como claves de ordenación.
SQLite ordena los datos en el índice de varias columnas por la primera columna especificada en CREATE INDEX
declaración. Luego, ordena los valores duplicados por la segunda columna y así sucesivamente.
Por lo tanto, el orden de las columnas es muy importante cuando crea un índice de varias columnas.
Para utilizar un índice de varias columnas, la consulta debe contener la condición que tiene el mismo orden de columnas definido en el índice.
La siguiente declaración crea un índice de varias columnas en el first_name
y last_name
columnas de los contacts
tabla:
CREATE INDEX idx_contacts_name
ON contacts (first_name, last_name);
Code language: SQL (Structured Query Language) (sql)
Pruébalo
Si consulta los contacts
tabla con una de las siguientes condiciones en el WHERE
cláusula, SQLite utilizará el índice de varias columnas para buscar datos.
1) filtrar datos por first_name
columna.
WHERE
first_name = 'John';
Code language: SQL (Structured Query Language) (sql)
2) filtrar datos por ambos first_name
y last_name
columnas:
WHERE
first_name = 'John' AND last_name = 'Doe';
Code language: SQL (Structured Query Language) (sql)
Sin embargo, SQLite no usará el índice de varias columnas si usa una de las siguientes condiciones.
1) filtrar por el last_name
solo columna.
WHERE
last_name = 'Doe';
Code language: SQL (Structured Query Language) (sql)
2) filtrar por first_name
O last_name
columnas.
last_name = 'Doe' OR first_name = 'John';
Code language: SQL (Structured Query Language) (sql)
SQLite Mostrar índices
Para encontrar todos los índices asociados con una tabla, utilice el siguiente comando:
PRAGMA index_list('table_name');
Code language: SQL (Structured Query Language) (sql)
Por ejemplo, esta declaración muestra todos los índices de los contacts
tabla:
PRAGMA index_list('playlist_track');
Code language: SQL (Structured Query Language) (sql)
Aquí está la salida:
Para obtener la información sobre las columnas en un índice, utilice el siguiente comando:
PRAGMA index_info('idx_contacts_name');
Code language: SQL (Structured Query Language) (sql)
Este ejemplo devuelve la lista de columnas del índice idx_contacts_name
:
Otra forma de obtener todos los índices de una base de datos es consultar desde el sqlite_master
tabla:
SELECT
type,
name,
tbl_name,
sql
FROM
sqlite_master
WHERE
type= 'index';
Code language: SQL (Structured Query Language) (sql)
SQLite DROP INDEX
declaración
Para eliminar un índice de una base de datos, utilice el DROP INDEX
declaración de la siguiente manera:
DROP INDEX [IF EXISTS] index_name;
Code language: SQL (Structured Query Language) (sql)
En esta sintaxis, especifica el nombre del índice que desea colocar después de DROP INDEX
palabras clave El IF EXISTS
La opción elimina un índice solo si existe.
Por ejemplo, usa la siguiente declaración para eliminar el idx_contacts_name
índice:
DROP INDEX idx_contacts_name;
Code language: SQL (Structured Query Language) (sql)
Pruébalo
El idx_contacts_name
index se elimina por completo de la base de datos.
En este tutorial, ha aprendido sobre el índice SQLite y cómo utilizar los índices para mejorar el rendimiento de la consulta o aplicar restricciones únicas.